周末研究了下java泛型,关于泛型通配符的协变与逆变问题,题目如下:
- 题目要求:创建一个泛型类Generic1<T>,它只有一个方法,将接受一个T类型的参数。创建第二个泛型类Generic2<T>,它也只有一个方法,将返回类型T的参数。编写一个泛型方法,它具有一个调用第一个泛型类的方法的逆变参数。编写第二个泛型方法,它具有一个调用第二个泛型类的方法的协变参数。
- 实例代码如下:
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"));
}
}
感兴趣的读者可以研究下,为题目提供更好的解决方案。
分享到:
相关推荐
Java 第二阶段提升编程能力【泛型】---- 代码 Java 第二阶段提升编程能力【泛型】---- 代码 Java 第二阶段提升编程能力【泛型】---- 代码 Java 第二阶段提升编程能力【泛型】---- 代码 Java 第二阶段提升编程能力...
全面总结Java泛型--实例
* 一个参数通配符的实例 * 说明:对一个包含了数值元素的集合进行汇总运算。在这种情况下,用户并不关心 * 集合中的每一个对象是什么类型,只要它是数值型即可,而且,用户也希望集合中可以 * 存放不同类型的数值...
【Java基础】泛型方法 - 右撇子 - 博客频道 - CSDN.NET
个人制作且上课使用的课件,希望对大家初步了解泛型相关内容有一定的帮助。个人制作且上课使用的课件,希望对大家初步了解泛型相关内容有一定的帮助。
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是...
补充知识:泛型1---马克-to-win java视频的详细描述与介绍
java基础-泛型通配符
NULL 博文链接:https://mydownload.iteye.com/blog/1330570
Delphi泛型库--DGL(The Delphi Generic Library) 在Delphi中实现的类型安全、高效、易用的泛型容器和算法库;借鉴了C++标准中的STL;
本代码资源是一个关于Java语言中泛型的讲解案例代码。通过使用实际的示例代码,详细讲解了泛型的定义、用法和优势。 适用人群: 有一定Java编程基础的开发者;对泛型概念感兴趣或希望加深理解的学习者。 使用场景...
Java泛型编程指南.pdf 此文章译自SUN的泛型编程指南
Java Generics and Collections 英文版,详细描述java 泛型技术
补充知识2 ---马克-to-win java视频泛型的详细描述与介绍
泛型应用--图的深度(广度)优先遍历.成语接龙例
java泛型源码Java泛型用法 步骤1 原始类型有问题。 第2步 使用泛型类型。 第三步 车库和车辆。 原始类型。 第四步 首先尝试生成车库。 木星在我的车库里。 第5步 泛型上限。 第6步 TripleGarage 步骤7 试图使用泛型...
Java泛型和集合]-英文版
这是一个使用JAVA实现的泛型编程,分为两部分,第一部分创建泛型类,并实例化泛型对象,得出相加结果。 第二部分用户自行输入0--4,选择要进行的加减乘除运算或退出,再输入要进行运算的两个数,并返回运算结果及...
java 泛型接口示例 java 泛型接口示例 java 泛型接口示例
《数学与泛型编程-高效编程的奥秘》个人阅读笔记