18

Generic クラス定義に複数の制約を追加できることはわかっています。たとえば、次のようになります。

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

しかし、型パラメーターとしてMyGeneric別のジェネリック ( ) を取り、そのジェネリック (例)SomeGeneric<T>の型パラメーター ( ) を制約するジェネリック ( ) が必要です。TT extends SomeClass

重要なことに、クラス内からSomeGenericとの両方の型を知る必要があります (両方をバインドする必要があります)。たとえば、次のようなものを想像してください。SomeClassGT

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

質問: 上記は機能しますが、私のクラスの実装者の作業を楽にするために、私のクラスには型パラメーターが 1 つしかない方がよいと思います。これを行う方法はありますか?

このようなものがいいでしょう (しかし、この特定のコードは正しくありません):

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

明確でない場合は、喜んで意図を明確にしようとします。

4

3 に答える 3

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
    } 
}
于 2013-05-15T12:37:54.117 に答える
0

これを想像してください:

Type t = someClass();
Type g = someGeneric(t);

foobar(g,t)

これに比べて

Type g = someGeneric(someClass());
foobar(g,?)

2 つ目は Evgeniy Dorofeev のソリューションです。問題がわかりますか?引数内で変数にバインドすることはできません。ジェネリックも同じ。やりたいことはこれ

Type g = someGeneric(Type t = someClass());
foobar(g,t)
于 2013-05-16T04:45:27.933 に答える