1

戻り型パラメーターは、型パラメーターとメソッドパラメーターの型パラメーターの両方のスーパーである必要があります。

これはコンパイルします:

import java.util.List;
interface Foo<A> {
    <R, B extends R> List<R> eg1(List<B> unit);
    <R> List<R> eg2(List<? extends R> unit);
}

ただし、RがAのスーパーである必要があることを強制するものではありません。それ、どうやったら出来るの?

事実上、私はこれらで表現されているようなことをしたいと思っています。

<B, R super A & B> List<R> func(List<B> unit);
<B> List<? super A & B> func(List<B> unit);

もちろん、それらはコンパイルされません。

これには2つの目的があります。

  1. 結果をAとBの両方のスーパークラスに割り当てられるようにしたい。
  2. このメソッドの実装では、AとBの両方を含めることができる結果タイプが必要です。したがって、コンパイルを行う最初の例は、結果にAを入れることができないため、機能しません。
4

2 に答える 2

1

クラスレベルでtypeパラメータに名前を付ける必要があると思います。

import java.util.List;
interface Foo<Base, A extends Base> {
    <B extends Base> List<Base> eg1(List<B> unit);
    <R> List<R> eg2(List<? extends R> unit);
}
于 2013-03-20T22:20:01.097 に答える
0

@LouisWassermanのコメントのおかげで、私は最初にそうすべきだった実装について考え始めました。どこかで、返すために構築するタイプを指定する必要があります。メソッド実装にハードコーディングされ、type param、param type paramなどとして指定されます。その仕様がどこにあっても、このインターフェイスメソッドのジェネリックを正しく定義できます。

つまり、return型を作成できないため、私がやろうとしていたことは意味がありません。

于 2013-03-20T23:11:18.927 に答える