package generic;import java.util.ArrayList;
import java.util.List;
/*** ? -->通配符,类型不确定,用于声明 变量|形参 上* 不能用在:* 1,创建对象* 2,创建泛型类 、泛型方法、泛型接口上**/
public class WildcardTest {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 test2(List<?> list){}*///?不能创建泛型类/*class Test<?>{}*/
}

当然这样用是没有什么意义的,它和用Object一样

泛型上限 extends:

几个有继承关系的类:

package generic;
/*** 继承链:*       Object*        /  \*     Apple  Pear*     /*  FujiApple *          * @author Administrator**/
public class Fruit {}
class Apple extends Fruit{}
class Pear extends Fruit{}
class FujiApple extends Apple{}

例子程序:

package generic;import java.util.ArrayList;
import java.util.List;
/*** extends:泛型的上限 表示 <= ,即 子类* 1,一般用于 限制操作* 2,不能用在添加数据上,一般都是读取操作* 3,规则:*    遇到  List<? extends Fruit> 什么样的数据可以往上放:*    List<Fruit>*    List<Apple>*    List<? extends Apple>*    不能存放:*    List<?>*    List<? extends Object>* @author Administrator**/
public class ExtendsTest {public static void main(String[] args) {//extends 为上限,List的类型上限是FruitTest<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);List<FujiApple> list4 = new ArrayList<FujiApple>();test(list4);List<? extends Apple> list7 = new ArrayList<FujiApple>();test(list7);//报错:因为 ? 相当于 ? extends Object,范围超过了FruitList<?> list5 = new ArrayList<Object>();
//        test(list5);List<? extends Object> list6 = new ArrayList<Object>();
//        test(list6);}//? extends Fruitpublic static void test(List<? extends Fruit> list){}//内部类static class Test<T extends Fruit>{}}

泛型的下限:Super

package generic;import java.util.ArrayList;
import java.util.List;/*** super: 泛型的下限 >= 父类或者自身1,一般用于 下限制操作* 2,能够添加数据上,不能添加父对象* 3,规则:*/
public class SuperTest {public static void main(String[] args) {//传入的List类型必须   >=Apple,即是 Apple类的父类或自身List<Apple> list1 = new ArrayList<Apple>();test(list1);List<Fruit> list2 = new ArrayList<Fruit>();test(list2);List<Object> list3 = new ArrayList<Object>();test(list3);//规则 Object > Fruit 正确List<? super Fruit> list4 = new ArrayList<Object>();test(list4);//Apple = Apple 正确List<? super Apple> list5 = new ArrayList<Apple>();test(list5);//FujiApple < Apple,编译报错List<? super FujiApple> list6 = new ArrayList<Object>();//test(list6);//? --> ? extends Object ,可能意思是左边声明是Object的子类,右边是Object,不行?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 generic;public class Stu<T> {private T score;public T getScore() {return score;}public void setScore(T score) {this.score = score;}}

学校类:

package generic;/*** @author Administrator** @param <T>*/
public class School<T> {private T stu;public T getStu() {return stu;}public void setStu(T stu) {this.stu = stu;}}

测试类:

package generic;import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;/*** 泛型嵌套* @author Administrator**/
public class StuApp {public static void main(String[] args) {Stu<String> stu = new Stu<String>();stu.setScore("优秀");System.out.println(stu.getScore());//泛型嵌套:School<Stu<String>> sch = new School<Stu<String>>();sch.setStu(stu);stu = sch.getStu();String score = stu.getScore();System.out.println(score);//HashMapMap<String,String> map = new HashMap<String,String>();map.put("a", "老大");map.put("b", "老二");Set<Entry<String, String>> entrySet = map.entrySet();for (Entry<String, String> entry : entrySet) {System.out.println(entry.getKey() +"--->"+ entry.getValue());}}
}

泛型没有多态:

package generic;import java.util.ArrayList;
import java.util.List;public class Other {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>(); //报错//JDK1.7泛型简化List<String> list2 = new ArrayList<>();}
}


深入Java泛型(二):通配符与嵌套相关推荐

  1. Java泛型06 : 通配符:上边界、下边界与无界

    超级通道: Java泛型学习系列-绪论 本章主要对Java泛型的通配符进行说明. 1.概念简介 在Java泛型定义时: 用<T>等大写字母标识泛型类型,用于表示未知类型. 用<T e ...

  2. java泛型程序设计——通配符类型+通配符的超类型限定

    [0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 通配符类型+通配符的超类型限定 的知识: [1]通配符类型相关 1. ...

  3. java 泛型与通配符

    1.泛型概念:所谓泛型,就是允许在定义类,接口时,通过一个标识来表示类中某个属性的类型或者是某个方法的返回值及参数类型 2.基本使用 package com.yl.pdfdemo.day08.p2;i ...

  4. Java高级开发面试,java泛型下界通配符

    微服务是什么 微服务起源于2005年Peter Rodgers博士在云端运算博览会提出的微Web服务(Micro-Web-Service),根本思想类似于Unix的管道设计理念.2014年,由Mart ...

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

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

  6. 不正确 有三种形式 说法 通配泛型_一看就懂 详解JAVA泛型通配符T,E,K,V区别...

    1. 先解释下泛型概念 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛 ...

  7. (转)JAVA泛型通配符T,E,K,V区别,T以及Class,Class的区别

    1. 先解释下泛型概念 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛 ...

  8. JAVA泛型通配符T,E,K,V区别,T以及ClassT,ClassT的区别

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

  9. Java泛型详解,史上最全图文详解

    泛型在java中有很重要的地位,无论是开源框架还是JDK源码都能看到它. 毫不夸张的说,泛型是通用设计上必不可少的元素,所以真正理解与正确使用泛型,是一门必修课. 一:泛型本质 Java 泛型(gen ...

  10. java 泛型示例_Java泛型示例教程–泛型方法,类,接口

    java 泛型示例 Java Genrics is one of the most important features introduced in Java 5. Java Genrics是Java ...

最新文章

  1. Python模块与类
  2. EF架构~为IEnumerable接口添加增删查等操作,原因是IEnumerable导航属性更放心
  3. 3Dslicer1:入门及基本控制
  4. 使用Lambda优化日志案例
  5. 导入第三方组件_大型 web 应用公共组件架构是如何来的?
  6. 被LTRIM(RTRIM())害死了,差点
  7. android studio有错误,清单合并失败,Android Studio中出现多个错误
  8. 清爽娱乐网系统源码 v5.69
  9. 最新一二线城市知名 IT 互联网公司名单出炉!
  10. android快速搭建界面,怎么样能快速搭建一个Android APP的界面和框架?
  11. 【协同任务】基于matlab人工蜂群算法多无人机作业路径规划【含Matlab源码 1235期】
  12. idea 2019.2 svn 忽略文件/目录 .idea *.iml target log
  13. 超市库存管理系统 (SSM JAVA)
  14. 多空对比(DKDB)指标
  15. 日历本(给出年份生成日历)
  16. LICEcap 简洁易用的动画屏幕录制软件
  17. TesterHome android app 编写历程(三)
  18. ATEN CS22DP 2端口USB DisplayPort带线式KVM多电脑切换器 (外接式切换按键)
  19. 实验九 使用异步方式实现文件读\写
  20. VOIP+PSTN集成方案

热门文章

  1. php switch换界面,php switch的“高级”用法详解
  2. mysql慢查询日志平时开启吗_MySQL开启慢查询日志功能的方法
  3. Python知识点3——列表操作
  4. ansys怎么合并体_亚马逊合并拆分变体实操(干货)-合并
  5. 二十五:设计模式的总结
  6. 日志切割之Logrotate
  7. java.lang.RuntimeException: Canvas: trying to draw too large(203212800bytes) bitmap.
  8. js获取当前浏览器地址栏的链接,然后在链接后面加参数
  9. MySql层级树查询
  10. OCR文字识别软件的快速任务功能如何用