java泛型---通配符,泛型嵌套

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的类型上限是Fruit
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);
List<FujiApple> list4 = new ArrayList<FujiApple>();
test(list4);
List<? extends Apple> list7 = new ArrayList<FujiApple>();
test(list7);
//报错:因为 ? 相当于 ? extends Object,范围超过了Fruit
List<?> list5 = new ArrayList<Object>();
// test(list5);
List<? extends Object> list6 = new ArrayList<Object>();
// test(list6);
} //? extends Fruit
public 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); //HashMap
Map<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泛型---通配符,泛型嵌套的更多相关文章
- Java自学-泛型 通配符
Java 泛型通配符 ? extends super 的用法 示例 1 : ? extends ArrayList heroList<? extends Hero> 表示这是一个Hero泛 ...
- JAVA 泛型通配符 ? EXTENDS SUPER 的用法
1. <? extends Hero> ArrayList heroList<? extends Hero> 表示这是一个Hero泛型或者其子类泛型heroList 的泛型可能 ...
- Java学习之==>泛型
一.什么是泛型 泛型,即“参数化类型”,在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型.也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类.接口 ...
- 黑马程序员——JAVA基础之泛型和通配符
------- android培训.java培训.期待与您交流! ---------- 泛型: JDK1.5版本以后出现新特性.用于解决安全问题,是一个类型安全机制. 泛型好处: ...
- Java 泛型 通配符类型
Java 泛型 通配符类型 @author ixenos 摘要:限定通配符类型.无限定通配符类型.与普通泛型区别.通配符捕获 通配符类型 通配符的子类型限定(?都是儿孙) <? extends ...
- 【Java】java 中的泛型通配符——从“偷偷地”地改变集合元素说起
一直没注意这方面的内容,想来这也算是基础了,就写了这个笔记. 首先java的通配符共有三种----先别紧张,现在只是粗略的过一下,看不看其实无所谓 类型 介绍 <?> 无限定通配符,等价于 ...
- java里程碑之泛型--类型通配符
1,泛型与数组在子类上面的对比 在整理java泛型的类型通配符之前,我们先来研究下java在数组设计上的一个不合理.我们来看下面代码: public class Test { public stati ...
- -1-3 java集合框架基础 java集合体系结构 Collection 常用java集合框架 如何选择集合 迭代器 泛型 通配符概念 Properties 集合 迭代器
集合又称之为容器存储对象的一种方式 •数组虽然也可以存储对象,但长度是固定的:显然需要可变长度的容器 集合和数组的区别? A:长度区别 ...
- [转]JAVA泛型通配符T,E,K,V区别,T以及Class<T>,Class<?>的区别
原文地址:https://www.jianshu.com/p/95f349258afb 1. 先解释下泛型概念 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被 ...
随机推荐
- 深入浅析JavaScript中with语句的理解
JavaScript 有个 with 关键字, with 语句的原本用意是为逐级的对象访问提供命名空间式的速写方式. 也就是在指定的代码区域, 直接通过节点名称调用对象. with语句的作用是暂时改变 ...
- sql笔试练习
转:http://www.360doc.com/content/16/0919/17/14804661_592046675.shtml 本文是在Cat Qi的参考原帖的基础之上经本人一题一题练习后编辑 ...
- Windows 下使用 GCC
MinGw 是 Minimal GNU on Windows 的缩写,允许在 GNU/Linux 和 Windows 平台生成本地的 Windows 程序而不需要第三方运行时库.本文主要介绍 MinG ...
- Tensorflow currently has no official prebuild for your CUDA, cuDNN combination.
INFO CUDA version: 10. ERROR cuDNN not found. See https://github.com/deepfakes/faceswap/blob/master/ ...
- (匹配 二维建图) Antenna Placement --POJ --3020
链接: http://poj.org/problem?id=3020 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82834#probl ...
- 理解JavaWeb项目中的路径问题——相对路径与绝对路径
背景: 在刚开始学习javaweb,使用servlet和jsp开发web项目的过程中,一直有一个问题困扰着我:servlet 和 jsp 之间相互跳转,跳转的路径应该如何书写,才能正确的访问到相应的s ...
- hdu2680 choose the best route
题目 题意:给定一个有向图,多个起点,一个终点,求起点到终点的最短路. 这道题TLE了好多次,两侧次的对比主要在于对起点的处理上,法一:最开始是采用的hdu2066--一个人的旅行,这道题的方法做的, ...
- [program]编程习惯总结(2015_11_25)
1. 前端页面不要的数据,那么后端就不要发送到前端: 如:我们根据各个大洲来建立了一个个大洲的讨论区,但是在发表讨论页面.我们却希望用户去选择与当前帖子相关的国家标签. 那么,我们只需要在后台使用国家 ...
- L-BFGS
L-BFGS算法比较适合在大规模的数值计算中,具备牛顿法收敛速度快的特点,但不需要牛顿法那样存储Hesse矩阵,因此节省了大量的空间以及计算资源.本文主要通过对于无约束最优化问题的一些常用算法总结,一 ...
- 【TypeScript】TypeScript 学习 4——模块
前端数据验证在改善用户体验上有很大作用,在学了之前的知识的时候,我们很可能会写出以下代码: interface StringValidator { isAcceptable(s: string): b ...