このような宣言:
class A<X extends Number & List> { }
は許可されていますが、このような宣言は許可されていません。
class A<? extends Number & List> { }
Java がそれを制限する理由について論理的な説明はありますか?
&実際の違いは何ですか
<T extends Number>
& <? extends Number>?
このような宣言:
class A<X extends Number & List> { }
は許可されていますが、このような宣言は許可されていません。
class A<? extends Number & List> { }
Java がそれを制限する理由について論理的な説明はありますか?
&実際の違いは何ですか
<T extends Number>
& <? extends Number>?
を使用した場合、typeパラメーターでは何もでき<? extends Number & List>
なくなります。それは完全に役に立たないでしょう。
同様に、? extends Number
数値を拡張する型を参照する必要がなく、名前を付ける必要がない場合の特殊なケースに対処できます。
のような型パラメーターの要点はT
、クラス内で型として使用できるようにすることです。そこにあるワイルドカードは何を意味するのでしょうか? どこでも使用できない場合、なぜ型パラメーターを使用する必要があるのでしょうか?
ジェネリッククラスとインターフェイスの宣言には、TやUなどの型パラメーターが必要です。はワイルドカードであり、それ自体が汎用的なメソッドパラメータに適しています。
class Foo<T extends Number & List> {
void doStuff(List<T> items) {
// ...
}
void doMoreStuff(List<? extends OutputStream> streams) {
// ...
}
}
doStuff()はList<T>
、TがクラスFooの型パラメーターである場合に操作することを示します。それで:
class Weird extends Number implements List {
//
}
Foo<Weird> f = new Foo<Weird>();
f.doStuff(...); // wants a List<Weird>
fでdoMoreStuff()を呼び出すと、、、、などのタイプのものを渡すことができますList<OutputStream>
。List<FilterOutputStream>
List<ByteArrayOutputStream>