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的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被 ...
随机推荐
- ubuntu安装nodejs,npm live-server
sudo apt-get install curl 先安装的是curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/in ...
- Ubuntu16.04下通过tar.gz包安装MySQL5.5.52
1.下载 tar.gz包 : https://dev.mysql.com/downloads/mysql/ 2. // 安装依赖 sudo apt-get install libaio-dev // ...
- 【webdriver自动化】使用unittest实现自动登录163邮箱然后新建一个联系人
#练习:登录163邮箱然后新建一个联系人 import unittest import time from selenium import webdriver from selenium.webdri ...
- Python使用PIL模块生成随机验证码
PIL模块的安装 pip3 install pillow 生成随机验证码图片 import random from PIL import Image, ImageDraw, ImageFont fro ...
- Redis整理
1. Redis采用的是单进程多线程的模式.当redis.conf中选项daemonize设置成yes时,代表开启守护进程模式.在该模式下,redis会在后台运行,并将进程pid号写入至redis.c ...
- 学号 20155219 《Java程序设计》第1周学习总结
学号 20155219 <Java程序设计>第1周学习总结 教材学习内容总结 JVM:是JAVA程序唯一认识的操作系统,其可执行文件为.class文档:具有让Java程序跨平台的功能.负责 ...
- C语言--第六周作业评分和总结(5班)
作业链接:https://edu.cnblogs.com/campus/hljkj/CS2017-5/homework/1250 一.评分要求 要求1 完成PTA第六周所有题,若存在抄袭现象,倒扣此题 ...
- PTA——猴子吃桃
PTA 7-35 猴子吃桃问题 #include<stdio.h> int main() { ; scanf("%d",&n); ; i<n; i++) ...
- 实验吧—Web——WP之 Forms
我们先打开解题链接: 做Web题的第一步就是查看网页源代码,当然,有些网页他不会让你点击右键,那么可以在地址栏里的地址前面加上:view-source: 当然也可以打开控制台F12 我们可以看到代码里 ...
- queue 的基本用法
queue 1.back() 返回一个引用,指向最后一个元素2.empty() 如果队列空则返回真3.front() 返回第一个元素4.pop() 删除第一个元素5.push() 在末尾加入一个元素6 ...