以下の理由が説明できますか?静的な一般的な方法
public class GenericsTest<T> {
public void doSomething(T v1, T v2) {
}
public static <T> void doSomethingStatic(T v1, T v2) {
}
public static <T> void doSomethingStaticList(List<T> v1, List<T> v2)
{
}
public static void main(String[] args) {
GenericsTest<String> gt = new GenericsTest<>();
// OK
gt.doSomething("abc", "abc");
// Not OK
gt.doSomething(1, "abc");
// OK
doSomethingStatic(1, 2);
// Still OK
doSomethingStatic(1, "abc");
// So why is this not OK?
List<String> list1=new LinkedList<>();
List<Integer> list2=new LinkedList<>();
doSomethingStaticList(list1,list2);
}
}
T v1, T v2
はdoSomethingStatic
で同じ型でなければなりませんが、私はまだ、異なるタイプ(整数と文字列)を渡すことができますよ。
doSomethingStatic()
がデフォルトで共通のスーパークラスを使用する場合、なぜdoSomethingStaticList()
は異なるタイプで動作しないのですか?
void doSomethingStatic(T v1、T v2){'、型変数は不要です。それは' public static void doSomethingStatic(Object v1、Object v2){'と意味的に同じです。 –
更新:両方の型と一致する 'T'がないためです。両方のリストと一致する唯一のタイプは、 'List'の生の型ですが、有効な' List 'はありません。 –
Hulk
リストの場合、 'T 'はそれらを両方とも有効にするためにどのようなスーパークラス型ですか?ジェネリックは不変であることを忘れないでください。ListをList