2014-10-10 108 views
4

Java代碼:強制泛型類型Java中的財產申報

class First {} 
class Second extends First {} 
class Jinkies<T> {} 
interface Greeting<T> {} 
class Hello<U extends T, T> implements Greeting<T> { 
    private Map<Jinkies<U>, List<U>> scooby; 
} 

scooby的聲明,既JinkiesList具有相同類型的參數 - 這就是我想要執行什麼。有沒有辦法實現這一目標在Java中,而不必訴諸Hello類的聲明列出兩個參數(UT)?

我想只有一個 - 例如像這樣:

class Hello<U extends T> implements Greeting<T> 

但是,這不會編譯。我有寫:的

new Hello<Second, First>() 

代替:

new Hello<Second>() 

即使我沒有在Hello身體關心First任何地方(也沒有的Hello的用戶)。

編輯 - 如@LouisWasserman解釋了評論,對我而言上面壞榜樣。也許澄清 - 比方說,我一直想做的事:

new Hello<First>() 

但隨後能夠使用任何U其中U extends First(即First或在上面的例子中Second)在整個Hello身體沒有照顧First與確保U始終是相同的。也就是說,如果我有兩種方法:

void method1(U a) {} 
void method2(U b) {} 

我希望能夠執行第一種方法的U是一樣的第二種方法的U - 但關心什麼是(即FirstSecond),只要它是相同的。

<U extends T> void method1(U a) {} 
<U extends T> void method2(U b) {} 

是行不通的,因爲我可以打電話給method1(first)method2(second)

編輯 - 通過思考這一點,這可能是行不通的其他方式。即如果只指定一個邊界,就可以用另一種方式。因此,如果只指定First,我可以「向下轉換」到Third。如果只指定Second,我可以「上傳」到Zero。回到實驗室...

+2

如果你寫了'新的你好',那麼它會實現什麼'Greeting '?你怎麼知道的?這聽起來像'問候'根本不應該有'T'。 – 2014-10-10 19:16:46

+0

@LouisWasserman'問候'由於其他原因需要'T'。我同意'新的你好()'不會出於你提到的原因 - 我的一個壞榜樣。編輯澄清。 – 2014-10-10 19:49:19

回答

2

這是同一類的定義,但也許現在更加明顯不同的通用名稱:

class Jinkies<X> {} 
interface Greeting<Y> {} 
class Hello<T,U extends T> implements Greeting<T> { 
    private Map<Jinkies<U>, List<U>> scooby; 
} 

正如你所看到的,在不聲明specifing Tnew Hello<Second, First>(),你不能說什麼T是。

+0

ty - 有道理,並編輯澄清 – 2014-10-10 19:49:39