最近、私は次のように定義されたメソッドが発生しましたし、私は正確にその使用法を理解していません。
public static <T, U extends T> T foo(U u) { ... }
サンプル使用は、このようなことができます:
// Baz is just the containing class of foo()
Number n = Baz.foo(1);
どこT
に推測されるNumber
とU
(おそらく)へInteger
。しかし、私は、これは、このメソッドの定義を例えばより優れているときの周り私の頭をラップすることはできません。
public static <T> T bar(T t) { ... }
私はこのようにそれを呼び出す場合:
Number n = Baz.bar(2);
コードはまだ動作します。T
推測されているいずれかNumber
またはInteger
(この例では、引数の型ならば分からないInteger
呼び出しサイトの戻り値の型よりも好ましいですNumber
)
私はこれらの質問を読んだ:1、2が、2つのパラメータを持つ第1の方法は一つだけジェネリックと第二の方法上の任意の利点を持っている場合、私はまだ知りません。
私は実際には、これは、と思うだけでメソッドの型パラメータがメソッドシグネチャの一部であり、パラメータ化された型の型パラメータとして表示されたときに意味があります。
(少なくとも、私はすぐにそれがでしょう例を思い付くことができませんでした、本当にそうでない場合は意味があります)
また、これはメソッドの型パラメータがで型パラメータとして使用されているあなたは、にリンクされていることを問題とする場合であるAutoBean
クラス。
小さなアップデート:
質問と他の回答での議論をもとに、この質問の核心は、おそらくタイプのパラメータが使用されているかの方法の誤解でした。そのため、この質問はの重複とみなすことができるの意味<T、UはTを拡張> Java関数の宣言では、うまくいけば、誰かがそれにもかかわらず、有用この回答を検討します。
最後に、パターンを使用する理由は<T, U extends T>
詳細にすることができるパラメータ化された型の継承関係に見られるかなり複雑。一例として、最も関連性の高い点を説明するために:AがList<Integer>
でないのサブタイプList<Number>
。
それが違いを生むことができます例の上映は以下の通りです。それは、常に動作します(と私の知る限り、意味がない)ことを「ささいな」実装が含まれています。しかし、バインドタイプは、とき型パラメータの関連するなりT
してU
も、メソッドのパラメータや戻り値の型の型パラメータです。Whith T extends U
、あなたは型パラメータとしてスーパータイプを持つ型を返すことができます。そうでなければ、あなたはその一例で示すように、できませんでした// Does not work
:
import java.util.ArrayList;
import java.util.List;
public class SupertypeMethod {
public static void main(String[] args) {
Integer integer = null;
Number number = null;
List<Number> numberList = null;
List<Integer> integerList = null;
// Always works:
integer = fooTrivial(integer);
number = fooTrivial(number);
number = fooTrivial(integer);
numberList = withList(numberList);
//numberList = withList(integerList); // Does not work
// Both work:
numberList = withListAndBound(numberList);
numberList = withListAndBound(integerList);
}
public static <T, U extends T> T fooTrivial(U u) {
return u;
}
public static <T, U extends T> List<T> withListAndBound(List<U> u) {
List<T> result = new ArrayList<T>();
result.add(u.get(0));
return result;
}
public static <T> List<T> withList(List<T> u) {
List<T> result = new ArrayList<T>();
result.add(u.get(0));
return result;
}
}
(これはもちろん、工夫少し見えますが、私は、これは実際には理にかなってどこ1はシナリオを想像できると思います)