泛型应用于泛型类或泛型方法的声明。

如类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 泛型与通配符(?)的更多相关文章

  1. Java泛型和通配符那点事

    泛型(Generic type 或者generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法 ...

  2. java 泛型的通配符和限定

    package cn.sasa.demo1; import java.util.ArrayList; import java.util.Collection; import java.util.Ite ...

  3. Java泛型之通配符

    原文点此链接 使用通配符的原因:Java中的数组是协变的,但是泛型不支持协变. 数组的协变 首先了解下什么是数组的协变,看下面的例子: Number[] nums = new Integer[10]; ...

  4. Java 泛型、通配符? 解惑

    Java 泛型通配符?解惑 分类: JAVA 2014-05-05 15:53 2799人阅读 评论(4) 收藏 举报 泛型通配符上界下界无界 目录(?)[+] 转自:http://www.linux ...

  5. JAVA 泛型与通配符的使用

    泛型的本质是参数化类型.即所操作的数据类型被指定为一个参数. 1.jdk 1.5/1.6 必须显式的写出泛型的类型. 2.jdk 1.7/1.8 不必显式的写出泛型的类型. 一.泛型声明 可以用< ...

  6. Java 泛型和通配符解惑

    转自:http://www.linuxidc.com/Linux/2013-10/90928.htm T  有类型 ?  未知类型 一.通配符的上界 既然知道List<Cat>并不是Lis ...

  7. java泛型之通配符?

    一.在说泛型通配符" ?" 之前先讲几个概念 1.里氏替换原则(Liskov Substitution Principle, LSP): 定义:所有引用基类(父类)的地方必须能透明 ...

  8. java 泛型: 通配符? 和 指定类型 T

    1. T通常用于类后面和 方法修饰符(返回值前面)后面 ,所以在使用之前必须确定类型,即新建实例时要制定具体类型, 而?通配符通常用于变量 ,在使用时给定即可 ? extends A  :  通配符上 ...

  9. [转]JAVA泛型通配符T,E,K,V区别,T以及Class<T>,Class<?>的区别

    原文地址:https://www.jianshu.com/p/95f349258afb 1. 先解释下泛型概念 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被 ...

随机推荐

  1. python 一行代码字符串转字典方法

    b = 'bid=Qzw9cKnyESM; ll="108288"; __yadk_uid=4YChvgeANLBEh4iV00n1tc0HQ8zpmSl1; __utmc=301 ...

  2. 2019-03-18-day013-装饰器与内置函数

    上周回顾 函数: def 函数名(): 缩进 函数体 闭包: a = 50 def func(): a = 10 def avg(): print(a) 函数名的使用: 当做值被赋值给变量 当做返回值 ...

  3. HDU 2585 Hotel(字符串的模糊匹配+递归)

    Problem Description Last year summer Max traveled to California for his vacation. He had a great tim ...

  4. input默认显示当前时间

    方法一: // 获取当天的年月日 new Date().getFullYear() + '-' + (new Date().getMonth() + 1) + '-' + new Date().get ...

  5. 计时器---JS

    <script type="text/javascript"> function count(){ var a=document.getElementById(&quo ...

  6. ERROR: gnu-config-native-20150728+gitAUTOINC+b576fa87c1-r0 do_unpack: Function failed: Fetcher failure: Fetch command failed with exit code 128, output: fatal: the '--set-upstream' option is no longer

    /********************************************************************** * ERROR: gnu-config-native-2 ...

  7. ECUST Div2 训练赛3 (只有代码)

    题解见:http://ecustacm.cn/contest/11/announcements A #include<bits/stdc++.h> #define rep(i,a,b) f ...

  8. get新技能:上传了 flv 或 MP4 文件到服务器,可访问总是出现 “无法找到该页”的 404 错误

    为什么我上传了 flv 或 MP4 文件到服务器,可访问总是出现 “无法找到该页”的 404 错误 为什么我上传了 flv 或 MP4 文件到服务器,可输入正确地址通过协议来访问总是出现 “无法找到该 ...

  9. git 应用

    git - 简易指南 助你开始使用 git 的简易指南,木有高深内容,;). 安装 下载 git OSX 版 下载 git Windows 版 下载 git Linux 版 创建新仓库 创建新文件夹, ...

  10. hdu 1556 A - Color the ball 其他做法

    #include<bits/stdc++.h> using namespace std; ; int c[maxn]; int n; int main() { ) { cin>> ...