2013-10-18 46 views
0

我有兩個類叫Matchers靜態方法,我需要在第三個類中使用,所以他們中的一個只能通過靜態導入來使用。但是,我無法爲靜態導入的方法明確指定類型參數(即<Type> method())。如何綁定只能靜態導入的方法的類型變量?

我該如何解決這個問題,而不必完全限定班級?

+2

請舉例。 –

+0

@SotiriosDelimanolis我不知道如何在這種情況下舉一個例子...我基本上想調用'匹配者。 method()',但'Matchers'已經被導入爲一個不同的類。 –

+0

'如何在不必完全限定課程的情況下解決此問題?'你不能。至少,不是AFAIK。 –

回答

0

你不行。至少不是在Java中(其他一些語言,例如Scala,可以給你導入一個類別的別名,這種類型很酷,可以在這種情況下使用)。

在這裏,您只需要爲兩個類或一個類使用全限定名(並導入另一個類)。

在一個文件中使用2個具有相同名稱的類不是最好的想法,除非你有一個非常好的用例。也許你只用一個Matchers就可以做你想做的事情?

我要在這裏做一些思維讀書,但我想這是沿着Hamcrest/Mockito Matchers的線?如果是這樣,那麼在大多數情況下,您只需使用其中一個即可。如果在非常不幸的情況下,你既需要再是,嗯,你是不幸的:-)

+0

是的,它實際上是Hamcrest匹配器。我做了一個糟糕的決定,實現一個叫做Matchers的類,這導致了這個問題。不幸的是,該名稱不能再作爲API的一部分進行更改。 –

+0

那麼很不幸,你處於不幸的位置:-)除非API不能被破壞或「碰到一個更高的版本」這會改變你的班級的名字,那麼我可以給你的最好的建議是導入匹配器類與更長的完全限定名稱,所以你的代碼會少一點混亂:-) –

0

想出了一個非常哈克的方式只是作爲替代完全限定類:

只需實現有問題的類的子類並在子類上調用父類靜態方法。這是允許的,甚至不會產生編譯器警告。由於該方法是靜態的,因此不涉及虛擬方法。子類只是作爲一個別名(所以更好地使它私人和最終的東西)。

0

有一種方法可能看起來有點不潔,但它已被標準覆蓋。您可以濫用本地變量作爲導入。由於它們的價值不會爲static方法調用關係,他們可以被初始化爲null

public class Imports 
{ 
    static <T> java.util.List<T> emptyList() 
    { 
    System.out.println("Imports.emptyList()"); 
    return java.util.Collections.emptyList(); 
    } 
    public static void main(String[] args) 
    { 
    final java.util.Collections c=null; 
    final Imports i=null; 
    System.out.println(c.emptyList()); 
    System.out.println(i.emptyList()); 
    } 
} 

c.emptyList()i.emptyList()指不同static方法在這裏。你甚至可以插入類型參數,例如c.<String>emptyList()。但是一些編譯器可能會發出警告,您必須使用這個技巧關閉一個類。但在某些情況下可能沒有更好的方法(重複合格的名稱很多次並不總是一種更好的方式)...