• 通配符

  • 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. IDEA2018.1安装配置文档

    一.软件安装 1. 下载地址: https://www.jetbrains.com/idea/download/#section=windows 2. 安装: 点击.exe,选择安装路径,点击next ...

  2. c语言数字图像处理(三):仿射变换

    仿射变换及坐标变换公式 几何变换改进图像中像素间的空间关系.这些变换通常称为橡皮模变换,因为它们可看成是在一块橡皮模上印刷一幅图像,然后根据预定的一组规则拉伸该薄膜.在数字图像处理中,几何变换由两个基 ...

  3. MIT-6.828-JOS-lab3:User Environments

    Lab 3: User Environments实验报告 tags:mit-6.828 os 概述: 本文是lab3的实验报告,主要介绍JOS中的进程,异常处理,系统调用.内容上分为三部分: 用户环境 ...

  4. 微软职位内部推荐-Principal Software Eng Mgr

    微软近期Open的职位: Job Title: &nbsp Principal Software Eng Mgr Work Location: Shanghai, China Job Desc ...

  5. Four-Operations

    开发环境:Eclipse 结对小伙伴:201306114416 陈键 (http://www.cnblogs.com/be-the-one/) 201306114452 吴舒婷 (http://www ...

  6. Practice1小学四则运算(改进)

    #include<stdio.h> #include<stdlib.h> #include<time.h> void srand(unsigned);//随机生成不 ...

  7. 软件工程作业 - Week 1

    构建之法读后疑问: 初步的完成构建程序设计思路之后实现过程中发现了问题或者可以优化的地方是立马就改进还是完成之后按照步骤统一进行优化. 覆盖性测试,针对一些永远用不到只是用来预防极为极端的情况下,例如 ...

  8. 评论beta发布

    1. 组名:飞天小女警 项目名:礼物挑选小工具 评价:该系统可以通过选择所要接礼的人的性别.年龄和与送礼者的关系及所要送礼的价值,就可以推荐出所送的礼物.还可以通过男/女所选的Top前10进行简单推荐 ...

  9. TestNG简单介绍以及安装—学习笔记1

    TestNG是什么 到这里,大家肯定已经运行了一些关于Selenium的测试用例了(这里主要是站着一个自动化测试工程师的角度来看待TestNG的,所以这里所说的也都是基于Web测试的验证点来说的,而不 ...

  10. C语言入门:02.第一个C语言程序

    一.开发工具的选择(1)可以用来写代码的工具:记事本.UltraEdit.Vim.Xcode等(2)选择Xcode的原因:苹果官方提供的开发利器.简化开发过程.有高亮显示功能 (3)使用Xcode新建 ...