java 泛型与通配符(?)
泛型应用于泛型类或泛型方法的声明。
如类GenericTest
public class GenericTest<T> {
private T item;
public void set(T item) {
this.item = item;
}
public T get() {
return item;
}
}
有该类生成对象时可以选择相应的类型,GenericTest<Integer> test = new GenericTest<>(); GenericTest<String> test = new GenericTest<>();
java中比较常见的是容器类,如List<Double> list = new ArrayList<>(),Map<Integer,String> map = new HashMap<>();
通配符(?)应用于泛型的使用
通配符是拿来使用定义好的泛型的,如使用上述泛型类的方法,
public void test(GenericTest<?> obj) {
System.out.println(obj);
}
如List<?> list = new ArrayList<String>(); 理论上?使list可以添加任何元素,但List<?>这种写法不能向list中添加任何元素(除了null),list.add("abc"); list.add(56); 都会报错。无法确定添加元素的类型,就无法分配内存大小。
较为常见的是<? extends T> 或者 <? super T> 带有边界的通配符。
List<? extends T> 表明list中的元素都是T及T的子类,List<? super T> 表明list中的元素都是T及T的父类。
Integer是Number的子类,但ArrayList<Integer>不是ArrayList<Number>的子类,如下声明是错误的。
ArrayList<Number> list = new ArrayList<Integer>(); // 错误。
但是list中可以添加Integer对象(Number子类对象)。
ArrayList<Number> list = new ArrayList<Number>();
list.add(new Integer(3)); // 正确
改为ArrayList<? extends Number> list = new ArrayList<Integer>(); 也是正确的。
<? extends T>不能往里存,只能向外取。
List<? extends Number> list = new ArrayList<>();
list.add(3); // 错误
list.add(2.2); // 错误
Number n = list.get(0); //正确
float f = (float)list.get(1); //正确
<? super T> 可以向里存,也可以向外取。
List<? super Integer> list = new ArrayList<>();
list.set(0, 2); // 正确
int a = (int)list.get(0); // 正确
java 泛型与通配符(?)的更多相关文章
- Java泛型和通配符那点事
泛型(Generic type 或者generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法 ...
- java 泛型的通配符和限定
package cn.sasa.demo1; import java.util.ArrayList; import java.util.Collection; import java.util.Ite ...
- Java泛型之通配符
原文点此链接 使用通配符的原因:Java中的数组是协变的,但是泛型不支持协变. 数组的协变 首先了解下什么是数组的协变,看下面的例子: Number[] nums = new Integer[10]; ...
- Java 泛型、通配符? 解惑
Java 泛型通配符?解惑 分类: JAVA 2014-05-05 15:53 2799人阅读 评论(4) 收藏 举报 泛型通配符上界下界无界 目录(?)[+] 转自:http://www.linux ...
- JAVA 泛型与通配符的使用
泛型的本质是参数化类型.即所操作的数据类型被指定为一个参数. 1.jdk 1.5/1.6 必须显式的写出泛型的类型. 2.jdk 1.7/1.8 不必显式的写出泛型的类型. 一.泛型声明 可以用< ...
- Java 泛型和通配符解惑
转自:http://www.linuxidc.com/Linux/2013-10/90928.htm T 有类型 ? 未知类型 一.通配符的上界 既然知道List<Cat>并不是Lis ...
- java泛型之通配符?
一.在说泛型通配符" ?" 之前先讲几个概念 1.里氏替换原则(Liskov Substitution Principle, LSP): 定义:所有引用基类(父类)的地方必须能透明 ...
- java 泛型: 通配符? 和 指定类型 T
1. T通常用于类后面和 方法修饰符(返回值前面)后面 ,所以在使用之前必须确定类型,即新建实例时要制定具体类型, 而?通配符通常用于变量 ,在使用时给定即可 ? extends A : 通配符上 ...
- [转]JAVA泛型通配符T,E,K,V区别,T以及Class<T>,Class<?>的区别
原文地址:https://www.jianshu.com/p/95f349258afb 1. 先解释下泛型概念 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被 ...
随机推荐
- C#清理所有正在使用的资源
namespace QQFrm{ partial class Form1 { /// <summary> /// 必需的设计器变量. ...
- 继承and派生
1.什么是继承?(python2与python3) 在程序中继承是一种新建子类的方式,新创建的类称之为子类\派生类,被继承 的类称之为父类\基类\超类 继承描述的是一种遗传关系,儿子可以重用爹的属性 ...
- java学习笔记5(方法)
方法: 1.如何创建方法 修饰符 返回值类型 方法名(参数){被封装的代码段} 2.方法的定义和使用的注意事项: a:方法不能定义在另一个方法里面: b:方法 名字和方法的参数列表,定义和调用时 ...
- 17 多校1 Add More Zero 水题
Problem Description There is a youngster known for amateur propositions concerning several mathemati ...
- POWER BI报表服务器混合云初了解
Power BI报表服务器 购买Power BI Premium时,你可以获取2个产品,一个是Power BI Service另外一个是Power BI Report Server. Power BI ...
- 九度OJ1450题-产生冠军-MAP的使用
题目1450:产生冠军 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:2839 解决:1161 题目描述: 有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛.球赛的规则如 ...
- 无根树同构_hash
先贴上地址 https://vjudge.net/problem/HDU-5732 判断有根树同构: 1. 直接用括号最小表示法 2. 利用括号最小表示法的思想进行hash 判断无根树同构: 1. 找 ...
- select标签(下拉菜单和列表)
下拉菜单和列表标签: <select> <option value="..." >选项</option> <option value=&q ...
- com.sun.org.apache.xerces.internal.impl.dv.util.Base64出现的问题
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64; 出现的问题是这个在eclipse中无法使用,解决方法如下: (1)进入ec ...
- C#并发编程之异步编程2
C#并发编程之异步编程(二) 写在前面 前面一篇文章介绍了异步编程的基本内容,同时也简要说明了async和await的一些用法.本篇文章将对async和await这两个关键字进行深入探讨,研究其中 ...