• 通配符

  • 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. ubuntu set/unset proxy

    export http_proxy export https_proxy unset http_proxy unset https_proxy

  2. GitHub 新手教程 四,Git GUI 新手教程(1),OpenSSH Public Key

    1,从开始菜单 启动 Git GUI,或者运行: D:\soft\Git\cmd\git-gui.exe(D:\soft\Git 为您的 GitHub 安装文件夹) 2,获取 SSH 密钥: 3,点击 ...

  3. SQLite与ContentProvider

    http://www.rom007.com/SQLite-yu-ContentProvider.html 在Android中,对于数据的存贮,有几种方式,有文件方式,有文件式数据库方式,Android ...

  4. ajax设置自定义请求头

    1, $.ajax({ url:apiUrl, type:"get", timeout : 5000, //超时时间设置,单位毫秒 dataType: "json&quo ...

  5. 2-Fifteenth Scrum Meeting-20151215

    任务安排 成员 今日完成 明日任务 闫昊 修复bug  写完学习进度记录的数据库操作 唐彬 编写与服务器交互的代码  编写与服务器交互的代码 史烨轩 获取视频url   余帆 修复bug  本地路径的 ...

  6. Java Socket 多线程聊天室

    本来这次作业我是想搞个图形界面的,然而现实情况是我把题意理解错了,于是乎失去了最初的兴致,还是把程序变成了功能正确但是“UI”不友好的console了,但是不管怎么样,前期的图形界面的开发还是很有收获 ...

  7. js 判断是否选中

    js的方法 window.onload = function(){ var oDiv = document.getElementById('div1'); alert(oDiv.checked) } ...

  8. [转帖] Oracle数据库 通过触发器 限制登录ip

    转帖 From https://yq.aliyun.com/ziliao/123360 create or replace trigger logon_ip_control after logon o ...

  9. css雪碧(CSS Sprite)和css3过渡效果综合应用

    在网页中我们经常可以看到,有些图片在鼠标经过的时候,有一个上下或左右的滑动效果,很实用页很方便,今天正好用到,拿来和大家分享一下,有什么不对或意见欢迎指正. html部分如下,这里本来打算用jq来着, ...

  10. MT【186】四边形中的余弦定理

    在四边形$ABCD$中,若$AB=a,BC=b,CD=c,AD=d,AC=e,BD=f$,则 $$a^2c^2+b^2d^2=e^2f^2+2abcd\cos(A+C).$$ 注:这个结果可以看成是余 ...