• 通配符

  • T, K, V, E 等泛型字母为有类型, 类型参数赋予具体的值

  • ? 未知类型 类型参数赋予不确定值, 任意类型

  • 只能用在 声明类型上,方法参数上, 不能用在定义泛型类上

  • 上限 extends, 指定类型必须是继承某个子类. 或者实现某个接口

    (不是用 implements), 即 <= 如

    ? extends Fruit

    ? extends List

  • 不能添加信息

  • 存在以下规则, 如

    List<Fruit> 满足 List<? extends Fruit>

    List<? extends Apple> 满足 List<? extends Fruit>

  • 下限 supper >=

  • 泛型嵌套

  • 泛型没有多态

  • 实例1 (通配符)

package cn.Douzi.Test03;

import java.util.ArrayList;
import java.util.List; /*
* ? --> 通配符,类型不确定, 用于声明变量 | 形参上
* 不能用在
* 1. 创建对象
* 2. 创建泛型类 泛型方法 泛型接口上
*
*/
public class WildcardsTest {
public static void main(String[] args) {
//声明
List<?> list = new ArrayList<Integer>();
list = new ArrayList<String>();
list = new ArrayList<Object>();
test(list); //编译错误, 不能创建对象
// list = new ArrayList<?>(); } public static void test(List<?> list) { } //不能用在泛型方法上
/*public static void test3(List<?> list) {
}*/ class Test<T> { } /* ? 不能创建泛型类上
class Test2<?> {
}*/
}
  • 实例2 (extends 上限)

package cn.Douzi.Test03;

import java.util.ArrayList;
import java.util.List; /*
* extends : 泛型的上限 <= 即子类
* 1. 一般用于 限制操作
* 2. 不能使用在添加数据上面 一般都是读取操作
* 3. 规则
* List<Fruit> ---> List<? extends Fruit>
* List<Apple> ---> List<? extends Fruit>
* List<? extends Apple> --> List<? extends Fruit>
* 不能存放
* List<?>
* List<? extends Object>
*
*/
public class ExtendsTest {
public static void main(String[] args) {
//extends 为上限
Test<Fruit> t1 = new Test<Fruit>();
Test<Apple> t2 = new Test<Apple>();
Test<Pear> t3 = new Test<Pear>(); //调用方法
List<? extends Fruit> list1 = new ArrayList<Fruit>();
test(list1); List<Fruit> list2 = new ArrayList<Fruit>();
test(list2); List<Apple> list3 = new ArrayList<Apple>();
test(list3); // ? extends Apple
List<? extends Apple> list4 = new ArrayList<FujiApple>();
test(list4); //? --> 为什么错误,因为 ? 等同于 ? extends Object
List<?> list5 = new ArrayList<Object>();
List<? extends Object> list6 = new ArrayList<Object>();
// test(list5);
// test(list6); List<FujiApple> app = new ArrayList<FujiApple>();
test(app);
} // ? extends Fruit
public static void test(List<? extends Fruit> list) {
//不能添加对象
// list.add(new Apple());
// list.add(new FujiApple()); list.add(null);
} //泛型类
static class Test<T> extends Fruit { }
}
  • 实例(下限)

package cn.Douzi.Test03;

import java.util.ArrayList;
import java.util.List; /***
* supper : 泛型的下限 >= 即父类或自身
* 1. 一般用于 下限制操作
* 2. 能够添加数据 一般都是都是 子对象和自己, 不能添加父对象
* 3. 规则
* List<Fruit> ---> List<? supper Fruit>
* List<Apple> ---> List<? super Fruit>
* List<? Fruit> --> List<? super Fruit>
* 不能存放
* List<?>
* List<? super FujiApple> --> List<? super Apple>
*
*/
public class Supper {
public static void main(String[] args) {
List<Apple> apple = new ArrayList<Apple>();
test(apple); List<Fruit> list2 = new ArrayList<Fruit>();
test(list2); List<Object> list3 = new ArrayList<Object>();
test(list3); //规则
List<? super Apple> list4 = new ArrayList<Apple>();
test(list4); List<? super Fruit> list5 = new ArrayList<Object>();
test(list5); //编译错误
// List<? super FujiApple> list6 = new ArrayList<FujiApple>();
// test(list6); // List<?> list7 = new ArrayList<Object>();
// test(list7); } public static void test(List<? super Apple> list) {
//不能添加父类信息
//
list.add(new Apple());
list.add(new FujiApple());
// list.add(new Fruit());
}
}
  • 实例(泛型嵌套)

package cn.Douzi.Test03;

import java.util.Map.Entry;
import java.util.HashMap;
import java.util.Map;
import java.util.Set; /***
* 泛型嵌套 --> 由外到内拆分
* @author Administrator
*
*/ public class StudentApp {
public static void main(String[] args) { Student<String> stu = new Student<String>(); stu.setScore("优秀");
System.out.println(stu.getScore()); Douzi<Student<String>> douzi = new Douzi<Student<String>>();
douzi.setStu(stu); stu = douzi.getStu();
String score = stu.getScore();
System.out.println(score); //HashMap
Map<String, String> map = new HashMap<String, String>(); map.put("a", "Douzi");
map.put("b", "DouDou"); Set<Entry<String,String>> entrySet = map.entrySet();
//增强for循环
for (Entry<String, String> entry : entrySet) {
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key + "-->" + value);
} }
}
  • 实例(泛型没有多态)

package cn.Douzi.Test03;

import java.util.ArrayList;
import java.util.List; /***
* 1. 泛型没有多态
* 2. 泛型没有数组
* @author Douzi
*
*/
public class Polymorphism { public static void main(String[] args) {
//多态
Fruit f = new Apple();
//泛型没有多态
// List<Fruit> list = new ArrayList<Apple>();
List<? extends Fruit> list = new ArrayList<Apple>(); //没有泛型数组
// Fruit<String>[] arr = new Fruit<String>[100];
// Fruit[] arr = new Fruit[100]; //可以 //JDK1.7 泛型简化
List<Fruit> list2 = new ArrayList<>(); }
}
  • 总结

1. 通配符 ? --> 类型不定, 声明变量上
2. 上限 extends <= 不能添加信息
下限 super >= 不能添加父信息
3. 泛型嵌套, 由外到内获取即可
4. 泛型没有多态, 泛型没有数组
5. jdk1.7泛型简化, 创建对象不用指定类型

自定义泛型_无多态_通配符无泛型数组_jdk7泛型使用的更多相关文章

  1. java中的泛型【T】与通配符【?】概念入门

    使用泛型的目的是利用Java编译机制,在编译过程中帮我们检测代码中不规范的有可能导致程序错误的代码.例如,我们都知道List容器可以持有任何类型的数据,所以我们可以把String和Integer等类型 ...

  2. B20J_2733_[HNOI2012]永无乡_权值线段树合并

    B20J_2733_[HNOI2012]永无乡_权值线段树合并 Description:n座岛,编号从1到n,每座岛都有自己的独一无二的重要度,按照重要度可以将这n座岛排名,名次用1到 n来表示.某些 ...

  3. 二、多线程基础-乐观锁_悲观锁_重入锁_读写锁_CAS无锁机制_自旋锁

    1.10乐观锁_悲观锁_重入锁_读写锁_CAS无锁机制_自旋锁1)乐观锁:就像它的名字一样,对于并发间操作产生的线程安全问题持乐观状态,乐观锁认为竞争不总是会发生,因此它不需要持有锁,将 比较-设置 ...

  4. Spring_MVC_教程_快速入门_深入分析

    Spring MVC 教程,快速入门,深入分析 博客分类: SPRING Spring MVC 教程快速入门  资源下载: Spring_MVC_教程_快速入门_深入分析V1.1.pdf Spring ...

  5. C++框架_之Qt的开始部分_概述_安装_创建项目_快捷键等一系列注意细节

    C++框架_之Qt的开始部分_概述_安装_创建项目_快捷键等一系列注意细节 1.Qt概述 1.1 什么是Qt Qt是一个跨平台的C++图形用户界面应用程序框架.它为应用程序开发者提供建立艺术级图形界面 ...

  6. 权限模块_使用权限_实现主页面的效果_显示左侧菜单&只显示有权限的菜单项

    权限模块__使用权限__实现主页面的效果 HomeAction.java public class HomeAction extends ActionSupport { public String i ...

  7. java泛型<? extends E> 有上限通配符与<? Super E>有上限通配符

    通配符?,?表示占位,表明将来使用的时候在指明类型 <?>无限定的通配符, 是让泛型能够接受未知类型的数据 <? extends E> 有上限通配符,能够接受指定类及其子类类型 ...

  8. BZOJ 1108: [POI2007]天然气管道Gaz 性质分析_小结论_巧妙

    Description Mary试图控制成都的天然气市场.专家已经标示出了最好的天然气井和中转站在成都的地图.现在需要将中转 站和天然气井连接起来.每个中转站必须被连接到正好一个钻油井,反之亦然. M ...

  9. day16_函数作用域_匿名函数_函数式编程_map_reduce_filter_(部分)内置函数

    20180729    补充部分代码 20180727    上传代码 #!/usr/bin/env python # -*- coding:utf-8 -*- # ***************** ...

随机推荐

  1. python程序出现No module named '_socket' 解决方法

    首先看一下这个错误,错误显示没有这个_socket这个模块 看一个简单的程序理解这个错误是怎么出现的 这个程序就是像浏览器发起请求发开一个链接然后关闭,一直循环,运行之后产生这个错误,产生这个错误的原 ...

  2. HyperLedger Fabric 学习思路分享

    HyperLedger Fabric 学习思路分享 HyperLedger Fabric最初是由Digital Asset和IBM公司贡献的.由Linux基金会主办的一个超级账本项目,它是一个目前非常 ...

  3. Windos 下python2.7安装 pymssql 解决方案

    最近在学python,到安装pymssql这一块遇到了不少问题. 第一:如何安装python 模块,也是最主要的问题. 可以这么理解:在安装python其它模块之前,可以先安装一个负责安装模块的模块. ...

  4. vue入门全局配置

    全局配置 Vue.config 是一个对象,包含 Vue 的全局配置.可以在启动应用之前修改下列属性: silent 类型:boolean 默认值:false 用法: Vue.config.silen ...

  5. LeetCode 638 Shopping Offers

    题目链接: LeetCode 638 Shopping Offers 题解 dynamic programing 需要用到进制转换来表示状态,或者可以直接用一个vector来保存状态. 代码 1.未优 ...

  6. YOLO(You Only Look Once)

    参考 YOLO(You Only Look Once)算法详解 YOLO算法的原理与实现 一.介绍 YOLO算法把物体检测问题处理成回归问题,用一个卷积神经网络结构就可以从输入图像直接预测boundi ...

  7. REQUIRES_NEW 如果不在一个事务那么自己创建一个事务 如果在一个事务中 自己在这个大事务里面在创建一个子事务 相当于嵌套事务 双层循环那种

    REQUIRES_NEW   如果不在一个事务那么自己创建一个事务 如果在一个事务中 自己在这个大事务里面在创建一个子事务  相当于嵌套事务 双层循环那种 不管是否存在事务,业务方法总会自己开启一个事 ...

  8. C# DataTable Select用法

    DataRow[] dr = ds.Tables[0].Select("列名='该列你要查询的值'"); DataRow[] dr = ds.Tables[0].Select(&q ...

  9. HTTTP及TCP的超时以及KEEP-ALIVE机制小结

    一.HTTP的超时和Keep Alive HTTP Keepalive 机制是http 1.1中增加的一个功能. 在HTTP 1.0中,客户端每发起一个http 请求,等收到接收方的应答之后就断开TC ...

  10. Spoj 8372 Triple Sums

    题意:给你n个数字,对于任意s,s满足\(s=u_i+u_j+u_k,i<j<k\),要求出所有的s和对应满足条件的i,j,k的方案数 Solution: 构造一个函数:\(A(x)=\s ...