Java Generic,包含1个类型参数和2个约束

时间:2013-05-15 11:56:21

标签: java generics

我知道可以在Generic类定义中添加多个约束,例如:

class Example<I extends Object & Comparable<Object>>{}

但我想要一个泛型(MyGeneric),它将另一个泛型(SomeGeneric<T>)作为其类型参数,并约束该泛型的类型参数(T)(例如{ {1}})。

重要的是,我需要知道类中T extends SomeClassSomeGeneric的类型(SomeClassG都需要绑定)。例如,想象一下这样的事情:

T

问题: 上面的工作,但我更喜欢我的类只有一个类型参数,以使我的班级的实施者的生活更轻松。有没有办法做到这一点?

这样的东西会很好(但这个特殊的代码是不正确的):

class MyGeneric<G extends SomeGeneric<T>, T extends SomeClass>
{
   public G returnSomeGenericImpl(){}
   public T returnSomeClassImpl(){}
}

如果我不清楚,我会很乐意澄清我的意图。

3 个答案:

答案 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)