3

重複の可能性:
Javaでネストされたジェネリック・パラメータを参照することは可能ですか?

よろしければ、Javaジェネリックに関する簡単な質問。インスタンス化のジェネリック パラメータとして使用されないジェネリック クラス全体の型を宣言するための構文はありますか。例えば:

public class <U extends FooUType> BarType<T extends FooType<U>>{

   public U getU(){return U;}
}

BarType を作成するには、それ自体に U を含む次のように記述しますが、U を個別に指定する必要はありません。そう:

BarType<SomeT<FooUType>> instance

U を個別に指定することなく、パラメータ化された SomeT から暗黙的に U の型を取得します。とは対照的に :

public class BarType<U extends FooUType, T extends FooType<U>> 

これには次が必要です。

BarType<FooUType,SomeT<FooUType>>

メソッドで同じアイデアに似たものを探していると思います:

public <U> boolean StupidMethod(String s){
    ...
}

<? extends FooUType>を返すクラス内のメソッドの戻り値の型で問題が発生するため、使用したくありません<U extends FooUType> U

明確にしてくれてありがとう!

4

2 に答える 2

2

コメントが言ったように、これは不可能です。

<? extends FooUType>を返すクラス内のメソッドの戻り値の型で問題が発生するため、使用したくありません<U extends FooUType> U

したがって、ここでは、クラスの一部のメソッドが返されると言っていますが、型パラメーターとして保持するU必要はありません 。Uまあ、あなたはそれを両方の方法で持つことはできません。どちらかがこれを持っています:

public class BarType<T extends FooType<U>, U extends FooUType>{

   public U getU() { ... }
}

またはこれ:

public class BarType<T extends FooType<? extends FooUType>>{

   public FooUType getU() { ... }
}

懸念しているノイズの多いインスタンス化だけの場合は、必要に応じて Java 7 を使用できますnew BarType<>。Java 7 を使用しない場合は、ファクトリ メソッドを宣言して、呼び出し元が型推論を使用できるようにします。

public static <T extends FooType<U>, U extends FooUType> BarType<T, U> make() {
    return new BarType<T, U>();
}
于 2012-11-09T19:16:31.277 に答える
2

皆さんありがとう、

結局、私は別の解決策に行きました。基本的に、非表示にしようとしていたクラスUは抽象的だったので、これを回避Uする方法がないため、ジェネリックパラメーターとして追加しました。次に、これを拡張する具体的なクラスを作成しU、呼び出し元がコードを肥大化させないように、型を黙って埋めさせました。

このようなもの:

public abstract class MyAbsClass<U extends Foo, T extends Bar<U>>{...}

public class ConcreteClass<T extends SomeBar> extends MyAbsClass<SilentUType, T>

whereSomeBarはパラメータ化されていません。ユーザーは、次のようにインスタンス化できますT

 new ConcreteClass<SomeDerivedBar>()

これは私のシナリオではうまく機能したので、他の人に役立つことを願っています.

于 2012-11-12T10:17:23.087 に答える