2015-03-25 118 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