JAva汎用ワイルドカード-コヒーレントとインバータ
3164 ワード
週末にjava汎型を研究し、汎型ワイルドカードのコヒーレントとインバータ問題について、テーマは以下の通りである. タイトル要件:汎用クラスGeneric 1を作成し、Tタイプのパラメータを受け入れる方法は1つしかありません.2番目の汎用クラスGeneric 2を作成するには、タイプTのパラメータを返す方法が1つしかありません.最初の汎用クラスを呼び出す方法のインバータパラメータを有する汎用メソッドを記述する.2番目の汎用クラスを呼び出すメソッドのコヒーレントパラメータを持つ2番目の汎用メソッドを記述します. インスタンスコードは、 です.
興味のある読者は研究の下で、テーマにもっと良い解決策を提供することができます.
package generics.exercises;
import java.util.ArrayList;
import java.util.List;
import typeinfo.pets.Dog;
public class ContraVarianceAndCovariant {
static class Generic1Sup<T> {
}
static class Generic1<T> extends Generic1Sup<T> {
void setT(T t) {
}
}
static class Generic1Sub<T> extends Generic1<T> {
}
static class Generic2Sup<T> {
}
static class Generic2<T> extends Generic2Sup<T> {
T getT(T t) {
return t;
}
}
static class Generic2Sub<T> extends Generic2<T> {
}
static <T> void writeWithWildcard(List<? super T> list, T item) {
list.add(item);
}
static <T> T readCovariant(List<? extends T> list) {
return list.get(0);
}
static List<Generic1<Dog>> dogs = new ArrayList<Generic1<Dog>>();
static List<Generic1Sup<Dog>> dogsSup = new ArrayList<Generic1Sup<Dog>>();
static List<Generic1Sub<Dog>> dogsSub = new ArrayList<Generic1Sub<Dog>>();
static List<Generic2<Dog>> dogs2 = new ArrayList<Generic2<Dog>>();
static List<Generic2Sup<Dog>> dogs2Sup = new ArrayList<Generic2Sup<Dog>>();
static List<Generic2Sub<Dog>> dogs2Sub = new ArrayList<Generic2Sub<Dog>>();
static void f1() {
writeWithWildcard(dogs, new Generic1<Dog>());
writeWithWildcard(dogsSup, new Generic1<Dog>());
// ! writeWithWildcard(dogsSub, new Generic1<Dog>());
Generic1<Dog> generic1 = dogs.get(0);
generic1.setT(new Dog("dog1"));
System.out.println(generic1);
}
static void f2() {
Generic2<Dog> generic2 = readCovariant(dogs2);
generic2 = (Generic2<Dog>) readCovariant(dogs2Sup);
generic2 = readCovariant(dogs2Sub);
generic2.getT(new Dog("dog2"));
System.out.println(generic2);
}
static class CovariantReader<T> {
T readCovariant(List<? extends T> list) {
return list.get(0);
}
}
static void f3() {
CovariantReader<Generic2<Dog>> fruitReader = new CovariantReader<Generic2<Dog>>();
Generic2<Dog> generic2 = fruitReader.readCovariant(dogs2);
// ! generic2 = fruitReader.readCovariant(dogs2Sup);
generic2 = fruitReader.readCovariant(dogs2Sub);
generic2.getT(new Dog("dog2"));
}
}
興味のある読者は研究の下で、テーマにもっと良い解決策を提供することができます.