java泛型--问号?和T或E或K或V的区别
所谓泛型,就是在定义类、接口、方法、参数或成员变量的时候,指定它们操作对象的类型为通用类型。
使用 尖括号 <> 操作符 (The diamond operator )表示泛型, 尖括号内可以放置大写字母 (代表一个未知类型) 或问号 ? (代表若干个类型)作为参数。比如,习惯上选择以下字母代表某种类型:
- T 意味某种类型
- E 意味 链表、数组里的元素,如List<E> list 表示 list 里的元素。
- K意味map(k,v) 里的键值 Key
- V 意味 返回或映射的值。
然而,泛型的运用要受到如下限制 :
- 不能使用基本类型的类型参数,可以使用其包装类型代替。
- 静态成员无法使用类型参数。
- 不能使用泛型类异常
- 不能实例化泛型对象或数组,如:
T t = new T(); T[] a=new T
;
5,. 不能使用泛型数组,如:
import java.util.*;
public class Test{
public static void main(String args[]){
List<String> arr[] = new ArrayList<String>[5];
}
}
D:\java\test\OS_China\generic>javac Test.java
Test.java:5: 错误: 创建泛型数组
List<String> arr[] = new ArrayList<String>[5];
^
1 个错误
至于代表若干类的,放在尖括号内的通配符 ?:<?>,还分 上限通配符 (Upper Bounded Wildcards) 和 下限通配符 (Lower Bounded Wildcards)。
论点:
上限通配符 <? extends U> 可以代表这个未知类型 U,或者 通过关键字 extends 所能想象出的 U 类的任何一个子类。同样,下限通配符 <? super L> 可以代表这个未知类型 L,或者 通过关键字 super 所能想象出的 L类的任何一个超类。
这里分别以多个接口 interface 和 多个类 class 为基础, 创建 继承关系。
并以通过编译的代码, 证明以上论点成立。

/* <? super T> 与 <? extends T> 的区别,
* T 代表一个给定的接口
* */
import java.util.*;
interface A1{}
interface A2{}
interface A3{}
interface A4{}
interface B1 extends A1{}
interface B2 extends A1,A2{}
interface B3 extends A3,A4{}
interface B4 extends A4{}
interface C1 extends B2{}
interface C2 extends B2,B3{}
interface C3 extends B3{}
interface D1 extends C1,C2{}
interface D2 extends C2{}
interface E1 extends D1{}
interface E2 extends D1{}
interface E3 extends D2{}
interface E4 extends D2{}
public class UP_Interface {
public static void main(String args[]){
/********************************************
* 此处 extends 表示 有上界的统配符 ?,上界为 C2
* 由此定义的引用 listUpper可以作为
* 接下来的 7 种 子泛型类型的 ArrayList 的引用来使用。
**********************************************/
List<? extends C2> listUpper;//上界统配符 ?, 上界为 C2
listUpper=new ArrayList<C2>();//能存储 C2 D1 D2 E1 E2 E3 E4
listUpper=new ArrayList<D1>();//能存储 D1 E1 E2
listUpper=new ArrayList<D2>();//能存储 D2 E3 E4
listUpper=new ArrayList<E1>();//能存储 E1
listUpper=new ArrayList<E2>();//能存储 E2
listUpper=new ArrayList<E3>();//能存储 E3
listUpper=new ArrayList<E4>();//能存储 E4
/*************************************************
* super 表示有下界的统配符 ? ,下界为 C2 ,
* 由此定义的引用 listLower 可以作为
* 接下来的 7 种 子泛型类型的 ArrayList 的引用来使用。
***************************************************/
List<? super C2> listLower;
listLower=new ArrayList<A1>(); //能存储 A1 B1 B2 C1 C2 D1 D2 E1 E2 E3 E4
listLower=new ArrayList<A2>(); //能存储 A2 B2 C1 C2 D1 D2 E1 E2 E3 E4
listLower=new ArrayList<A3>(); //能存储 A3 B3 C2 C3 D1 D2 E1 E2 E3 E4
listLower=new ArrayList<A4>(); //能存储 A4 B3 B4 C2 C3 D1 D2 E1 E2 E3 E4
listLower=new ArrayList<B2>(); //能存储 B2 C1 C2 D1 D2 E1 E2 E3 E4
listLower=new ArrayList<B3>(); //能存储 B3 C2 C3 D1 D2 E1 E2 E3 E4
listLower=new ArrayList<C2>();// 能存储 C2 D1 D2 E1 E2 E3 E4
}
}

/* <? super T> 与 <? extends T> 的区别,
* T 代表一个给定的类
* */
import java.util.*;
class A1{}
class A2{}
class A3{}
class A4{}
class B1 extends A1{}
class B2 extends A1{}
class B3 extends A3{}
class B4 extends A4{}
class C1 extends B2{}
class C2 extends B2{}
class C3 extends B3{}
class D1 extends C1{}
class D2 extends C2{}
class E1 extends D1{}
class E2 extends D1{}
class E3 extends D2{}
class E4 extends D2{}
public class UP_Class{
public static void main(String args[]){
/********************************************
* 此处 extends 表示 有上界的统配符 ?,上界为 C2
* 由此定义的引用 listUpper可以作为
* 接下来的 7 种 子泛型类型的 ArrayList 的引用来使用。
**********************************************/
List<? extends C2> listUpper;//统配符 ? 的上界为 C2
listUpper=new ArrayList<C2>();//能存储 C2 D2 E3 E4
listUpper=new ArrayList<D2>();//能存储 D2 E3 E4
listUpper=new ArrayList<E3>();
listUpper=new ArrayList<E4>();
/*************************************************
* super 表示有下界的统配符 ? ,下界为 C2 ,
* 由此定义的引用 listLower 可以作为
* 接下来的 7 种 子泛型类型的 ArrayList 的引用来使用。
***************************************************/
List<? super C2> listLower;
listLower=new ArrayList<A1>(); //能存储 A1 B1 B2 C1 C2 D1 D2 E1 E2 E3 E4
listLower=new ArrayList<B2>(); //能存储 B2 C1 C2 D1 D2 E1 E2 E3 E4
listLower=new ArrayList<C2>();// 能存储 D2 E3 E4
}
}
java泛型--问号?和T或E或K或V的区别的更多相关文章
- java中?和A、B、T、E、K、V的区别
使用泛型 List<T> list = new ArrayList<T>(); T t = list.get(0); 不使用泛型 List list = new ArrayLi ...
- Java泛型
什么是泛型? 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的一个 ...
- 【Java心得总结四】Java泛型下——万恶的擦除
一.万恶的擦除 我在自己总结的[Java心得总结三]Java泛型上——初识泛型这篇博文中提到了Java中对泛型擦除的问题,考虑下面代码: import java.util.*; public clas ...
- Java泛型总结
1. 什么是泛型?泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的 ...
- java泛型的讲解
java泛型 什么是泛型? 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指 ...
- Java泛型和通配符那点事
泛型(Generic type 或者generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法 ...
- java泛型【收藏】
什么是泛型? 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的一个 ...
- Java 泛型 <? super T> 中 super 怎么 理解?与 < ? extends T>有何不同?
Java 泛型 <? super T> 中 super 怎么 理解?与 extends 有何不同? 简介 前两篇文章介绍了泛型的基本用法.类型擦除以及泛型数组.在泛型的使用中,还有个重要的 ...
- Java泛型入门
Java泛型入门 在学习本章之前,须要对Java的集合(Collection.Map)有一定的基础. Java集合有一个缺点.就是把一个对象"丢进"集合里后,集合就会&qu ...
随机推荐
- 开发指南~小程序代码构成~JSON配置
2.1 JSON 配置 JSON 是一种数据格式,并不是编程语言,在小程序中,JSON扮演的静态配置的角色. 2.1.1 一个例子 先看一个例子,打开开发工具的编辑器,在根目录下可以找到 app.j ...
- postscript打印机语言
http://tongxinmao.com/Article/Detail/id/257
- IOT设备通讯,MQTT物联网协议,MQTTnet
一.IOT设备的特性 硬件能力差(存储能力基本只有几MB,CPU频率低连使用HTTP请求都很奢侈) 系统千差万别(Brillo,mbedOS,RIOT等) 如使用电池供电,电量消耗敏感 如果是小设备, ...
- 六.Protobuf3引入其他.proto文件
Protobuf3 使用其他消息类型 您可以使用其他消息类型作为字段类型.例如,假设您希望在每个SearchResponse消息中包含Result消息,为此,您可以在.proto中定义结果消息类型,然 ...
- python - django authenticate 返回结果一直是None
# 不论怎么测试 authenticate 返回结果一直是None,查了查原因好像是 django 2.1 版本的问题 ( 我用的是 2.1.7) 解决方法: 1. 先导入 from django.c ...
- (转载) SQL Server AG集群启动不起来的临时自救大招
背景 前晚一朋友遇到AG集群发生来回切换不稳定的情况,情急之下,朋友在命令行使用命令重启WSFC集群 结果重启WSFC集群之后,非但没有好转,导致整个AG无法启动,主副本和辅助副本都处于正在解析的状态 ...
- javascript之大文件分段上传、断点续传
这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数 下面直接贴代码吧,一些难懂的我大部分都加上注释了: 上传文件实体类: 看得 ...
- jsp+ tinymce粘贴word
最近公司做项目需要实现一个功能,在网页富文本编辑器中实现粘贴Word图文的功能. 我们在网站中使用的Web编辑器比较多,都是根据用户需求来选择的.目前还没有固定哪一个编辑器 有时候用的是UEditor ...
- ZOJ 1608 Two Circles and a Rectangle
Give you two circles and a rectangle, your task is to judge wheather the two circles can be put into ...
- Go程序员面试算法宝典-读后感1
这本书是讲解Go语言程序员面试笔试真题的书籍,讲的还不错,值得一看. 计算机技术博大精深,日新月异………………大神们疯狂的更新着技术,(我就更新,不服打我呀)虽然换汤不换药,又有几个人能精通基础,再延 ...