• 通配符

  • 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. install opencv 2.4.10 with issue :"nvcc fatal : Unsupported gpu architecture 'compute_11'"

    issue: nvcc fatal   : Unsupported gpu architecture 'compute_11'CMake Error at cuda_compile_generated ...

  2. BigDecimal的setScale()方法无效(坑)

    最近在使用BigDecimal进行四舍五入时,发现setScale()方法设置的精度值并没有起作用,一度让我怀疑起是否jdk有bug,代码如下: 错误代码 double d = 7.199999999 ...

  3. (第十二周)Debug阶段成员贡献分

    项目名:食物链教学工具 组名:奋斗吧兄弟 组长:黄兴 组员:李俞寰.杜桥.栾骄阳.王东涵 个人贡献分=基础分+表现分 基础分=5*5*0.5/5=2.5 成员得分如下: 成员 基础分 表现分 个人贡献 ...

  4. week2--操作系统是如何工作的

    潘恒   原创作品转载请注明出处   <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.一个简单的时间 ...

  5. linux内核分析--计算机是如何工作的

    实验部分 使用gcc -S -o main.s main.c -m32命令将源代码编译成汇编代码. 源代码如下: int g(int x) { return x + 9; } int f(int x) ...

  6. 云平台项目--学习经验--打包压缩工具requirejs

    requirejs是一个JavaScript模块加载器.适合在浏览器中国使用,也可以在其他脚本环境使用,它鼓励了代码的模块化.使用RequireJS加载模块化脚本将提高代码的加载速度和质量.如何加载R ...

  7. webSocket开发chat application过程

    本次使用websocket开发chat的功能已经接近尾声,等到压力测试结束之后就可以上线了.在此记录一下整个开发过程. ---------------------------------------- ...

  8. 从零开始学Kotlin-扩展函数(10)

    从零开始学Kotlin基础篇系列文章 什么是扩展函数 扩展函数数是指在一个类上增加一种新的行为,我们甚至没有这个类代码的访问权限: Kotlin 可以对一个类的属性和方法进行扩展,且不需要继承或使用 ...

  9. Git从零开始(二)

    前面提交了一个test1.txt文件,接下来看看这个文件接下来的命运. 一.继续修改并提交 在test1.txt中修改后, git status 查看git的状态, 会提示我们文件test1.txt被 ...

  10. MySQL基础(二):视图、触发器、函数、事务、存储过程

    一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用. 视图和上一篇学到的临时表搜索类似. ...