具有 1 个类型参数和 2 个约束的 Java 泛型

2022-09-02 22:42:19

我知道可以向泛型类定义添加多个约束,例如:

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

但是我想要一个泛型 (),它将另一个泛型 () 作为其类型参数,并约束该泛型的类型参数 ()(例如 )。MyGenericSomeGeneric<T>TT extends SomeClass

重要的是,我需要知道两者的类型,并从类内部知道(并且需要同时绑定)。例如,想象一下这样的事情:SomeGenericSomeClassGT

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(){}
}

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


答案 1

它看起来不可能实现。

通过删除一个类型变量并尝试定义它,将类型定义减少一个顺序后,

class G extends SomeGeneric<T extends SomeClass>{}

不编译,因为类型参数 T 未相对于已定义的类型参数进行绑定。但是,这有效 -

class G<T extends SomeClass> extends SomeGeneric<T>{}

因此,我推断,使用两种类型进行参数化的唯一方法是预先声明它们。


答案 2

试试这个

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
    } 
}

推荐