【发布时间】:2013-05-09 23:38:30
【问题描述】:
我知道可以将多个约束添加到通用类定义中,例如:
class Example<I extends Object & Comparable<Object>>{}
但我想要一个泛型 (MyGeneric),它采用另一个泛型 (SomeGeneric<T>) 作为其类型参数,并约束该泛型 (例如 T extends SomeClass) 的类型参数 (T)。
重要的是,我需要知道类内部SomeGeneric 和SomeClass 的类型(G 和T 都需要绑定)。例如,想象这样的事情:
class MyGeneric<G extends SomeGeneric<T>, T extends SomeClass>
{
public G returnSomeGenericImpl(){}
public T returnSomeClassImpl(){}
}
问题: 上面的方法有效,但我希望我的类只有一个类型参数,以使我的类的实现者生活更轻松。有没有办法做到这一点?
这样的东西会很好(但这个特定的代码是不正确的):
class MyGeneric<G extends SomeGeneric<T extends SomeClass>>
{
public G returnSomeGenericImpl(){}
public T returnSomeClassImpl(){}
}
如果我不清楚,我很乐意澄清我的意图。
【问题讨论】:
-
我不明白这怎么可能奏效。如果您从不指定具体类型
T,编译器应该如何猜测它?如果只有一个选项,那很容易,但通常没有。如果您不关心特定类型,那么为什么不使用有界通配符类型(或方法上的本地类型参数)。 -
@JoachimSauer 你是说由于类型擦除,编译器可以强制执行我想要的约束,但无法提取/知道泛型的类型?例如,它可以做
<G extends SomeGeneric<SomeClass>>甚至<G extends SomeGeneric<? extends SomeClass>>,但是T的类型(在这种情况下是?)是未知的。 -
@JoachimSauer 关于您评论的第二部分,显然我确实关心特定类型,因为我想从
public T returnSomeClassImpl(){}返回它的一个实例 -
@Bohemian 指定两种类型一般是没有问题的,但是在这种情况下写
new Whatever<SomeGeneric<T>,T>()感觉是多余的,我们只是重复T。如果不可能,那就不可能,这就是问题的重点 -
好吧,如果你想将
G extends SomeGeneric<T>绑定到SomeGeneric<T>,那么也许你可以完全摆脱G?