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 ...
随机推荐
- js对样式的操作
本文有:对某个事件的来回操作实现对css样式的来回修改 .比如实现hover效果 <!DOCTYPE html> <html> <head> <meta ch ...
- java连接Oracle数据库的操作说明
在测试中,我们常常需要连接Oracle数据库来进行查询对比.下面,我们就来看看,如何使用java代码来连接数据库,并且取出我们想要的数值. 首先,java中如果要连接Oracle数据库,需要jdbc的 ...
- python3 生成二维码并存入word文档
#二维码的制作与解析 import qrcode,zxing,os s='https:////www.baidu.com/' res=qrcode.make(data=s) res.show() re ...
- minhash pyspark 源码分析——hash join table是关键
从下面分析可以看出,是先做了hash计算,然后使用hash join table来讲hash值相等的数据合并在一起.然后再使用udf计算距离,最后再filter出满足阈值的数据: 参考:https:/ ...
- SWPUCTF 2019总结以及部分WP
本次SWPUCTF开赛了,一共做了5个misc+2个web,RE和Android没时间看= =,pwn完全不会,果然又是和去年一样划水.题目都出的很不错,做题的时候思路其实也容易想到,剩下几个web有 ...
- String 堆内存和栈内存
java把内存划分为两种:一种是栈(stack)内存,一种是堆(heap)内存 在函数中定义的一些基本类型的变量和对象的引用变量都在栈内存中分配,当在一段代码块定义一个变量时,java就在栈中为这个变 ...
- JQuery购物车多物品数量的加减+总价计算
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Dobbox
一.向本地仓库导入Dubbox依赖 1.1解压压缩包 1.2打开cmd窗口切到源码包路径 1.3输入命令行 1.4成功后展示如图 1.5输入命令行 1.6成功后如图 public class DoSo ...
- react 面试指南
------------恢复内容开始------------ 什么是声明式编程 声明式编程是一种编程范式,它关注的是你要做什么,而不是如何做.它表达逻辑而不显式地定义步骤.这意味着我们需要根据逻辑的计 ...
- 01_搭建新浪云SAE
Step1:注册新浪云计算平台用新浪微博登陆新浪云计算平台,网址:http://sae.sina.com.cn/ 登陆成功之后会跳转到安全设置页面,安全设置页面要填写的东西比较多,需要注意:安全设置里 ...