2015-03-25 100 views
1

說我有一些類如下:如何在類中使用擴展泛型類型?

class A { } 

class B<TA extends A> { } 

class C<TB extends B<? extends A>> { 
    TA varOfTypeTA; // this throws an error obviously 
} 

我如何定義的varOfTypeTA類型是什麼TB的TA是什麼?

我知道我可以將其定義爲A varOfTypeTA,但我希望它的類型爲TA而不是A

我試圖迫使它用class C<TB extends B<TA extends A>>來定義TA,所以我可以使用TA,但是這會引發語法錯誤。

爲了澄清,如果我再定義這些類:

class Horse extends A { } 

class HorseHerd extends B<Horse> { } 

class HorseHerder extends C<HorseHerd> { 
    Horse getFavoriteHorse() { return varOfTypeTA; } // varOfTypeTA defined in class C must be of type Horse, otherwise I have to cast 
} 

我怎樣才能讓varOfTypeTAHorse類型的?

回答

6

同時聲明TA作爲同一類中的通用名。

public class C<TA extends A, TB extends B<TA>> { 
    TA varOfTypeTA; 
} 

然後你就可以在你的類中使用TA

class HorseHerder extends C<Horse, HorseHerd> { 
    Horse getFavoriteHorse() { return this.varOfTypeTA; } 
} 

我也很驚訝地發現聲明的順序在這裏似乎並不重要。雖然我寧願首先聲明TA,但我發現此代碼也編譯爲:

public class C<TB extends B<TA>, TA extends A> { 
    TA varOfTypeTA; 
} 
+0

我擔心這將是唯一的答案。沒有每次都將其作爲單獨類型添加的方式來聲明它的方法? – manixrock 2015-03-25 12:23:50

+1

我可以看到你只需要一個的唯一方法就是如果你可以刪除'TB'。如果你可以創建一個類'Herd ',你可以爲每個'TA'使用,那麼你可以聲明'public class C ',在裏面使用'Herd '而不是'TB' 'C',然後聲明'public class HorseHerder extends C '來擴展它。 – 2015-03-25 15:51:04

+1

如果您需要使用'TA'來設置'C',那麼您需要聲明'TA'。 – 2015-03-25 15:52:07

1

您必須同時傳遞兩個泛型類型。因此,例如:

class C<TB extends B<TA>, TA extends A> { 
    TA varOfTypeTA; 
} 

class Horse extends A {} 

class HorseHerd extends B<Horse> {} 

class HorseHerder extends C<HorseHerd, Horse> { 
    Horse getFavoriteHorse() { return varOfTypeTA; } 
} 
+0

寧願埃裏克羅伯遜的方法。在聲明之前使用某些東西總是令人困惑。在這裏你使用** TA **類型,並在使用後聲明它:) – Vyncent 2015-03-25 12:03:48

+0

@Vyncent同意。我會在這裏留下這個答案,以表明它可以通過其他方式完成。 – blalasaadri 2015-03-25 12:08:59

+0

沒有概率,你的回答是正確的,我只是告訴我更喜歡哪種方法;) – Vyncent 2015-03-25 12:11:06