我知道可以在Generic类定义中添加多个约束,例如:
class Example<I extends Object & Comparable<Object>>{}
但我想要一个泛型(MyGeneric
),它将另一个泛型(SomeGeneric<T>
)作为其类型参数,并约束该泛型的类型参数(T
)(例如{ {1}})。
重要的是,我需要知道类中T extends SomeClass
和SomeGeneric
的类型(SomeClass
和G
都需要绑定)。例如,想象一下这样的事情:
T
问题: 上面的工作,但我更喜欢我的类只有一个类型参数,以使我的班级的实施者的生活更轻松。有没有办法做到这一点?
这样的东西会很好(但这个特殊的代码是不正确的):
class MyGeneric<G extends SomeGeneric<T>, T extends SomeClass>
{
public G returnSomeGenericImpl(){}
public T returnSomeClassImpl(){}
}
如果我不清楚,我会很乐意澄清我的意图。
答案 0 :(得分:1)
试试这个
class Test1<T extends List<? extends Number>> {
public static void main(String[] args) throws Exception {
new Test1<ArrayList<Number>>();
new Test1<ArrayList<Integer>>();
new Test1<ArrayList<Object>>(); // compile error
}
}
答案 1 :(得分:1)
看起来无法实现。
通过删除一个类型变量并尝试定义它来将类型定义减少一个订单后,
class G extends SomeGeneric<T extends SomeClass>{}
不编译,因为类型参数T未绑定到已定义的类型参数。但是,这有效 -
class G<T extends SomeClass> extends SomeGeneric<T>{}
因此,我推断使用两种类型进行参数化的唯一方法是预先声明它们。
答案 2 :(得分:0)
想象一下:
Type t = someClass();
Type g = someGeneric(t);
foobar(g,t)
与此相比
Type g = someGeneric(someClass());
foobar(g,?)
第二个是Evgeniy Dorofeev的解决方案。 你看到了问题?您不能绑定到参数中的变量。与泛型相同。 你想要做的就是这个
Type g = someGeneric(Type t = someClass());
foobar(g,t)