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 ...
随机推荐
- linux ssh_config和sshd_config配置文件学习
在远程管理linux系统基本上都要使用到ssh,原因很简单:telnet.FTP等传输方式是以明文传送用户认证信息,本质上是不安全的,存在被网络窃听的危险.SSH(Secure Shell)目前较可 ...
- 一些SQL保存
因为两种Oracle数据库中对于结果行号的处理异同造成的. 在MSSQLServer中,可以使用top和ROW_NUMBER()方法的结合来实现,一般写法比较简单,而Oracle则有很大的不同. 只能 ...
- python爬有道翻译
在有道翻译页面中打开开发者工具,在Headers板块找到Request URL以及相应的data. import urllib.request import urllib.parse import j ...
- Immediate Decodability UVA-644(qsort排序 + 模拟)
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> us ...
- CentOS7怎样安装Nginx1.12.2
通过nginx官网的源码安装 yum -y install gcc* openssl* pcre* zlib* 安装相关依赖 这一步很重要 不然会报乱七八糟的错误 cd /usr/local进入/us ...
- 微信小程序~性能
(1)优化建议 setData setData 是小程序开发中使用最频繁的接口,也是最容易引发性能问题的接口.在介绍常见的错误用法前,先简单介绍一下 setData 背后的工作原理. 工作原理 小程序 ...
- python获取当前文件夹下所有文件名【转】
os 模块下有两个函数: os.walk() os.listdir() 1 # -*- coding: utf-8 -*- 2 3 import os 4 5 def file_name(file_d ...
- Dubbo源码分析:Dubbo协议解码
Dubbo协议解码时序图
- 【贪心】Communication System POJ 1018
题目链接:http://poj.org/problem?id=1018 题目大意:有n种通讯设备,每种有mi个制造商,bi.pi分别是带宽和价格.在每种设备中选一个制造商让最小带宽B与总价格P的比值B ...
- Linux 一条长命令占用多行
前言 考察下面的脚本: ? 1 emcc -o ./dist/test.html --shell-file ./tmp.html --source-map-base dist -O3 -g4 --so ...