java泛型2,通配符?专辑(以及泛型其他特性)
2017-08-14 15:31
337 查看
一.很重要的概念:?是实际参数,不是形式参数。
1.?实际参数,也就是使用的时候传的参数,不是定义的时候使用的参数。?关键字不能用在泛型的类型定义上。
二.?详解
1.?是一个通配符,称为泛型通配符。
2.?代表未知的类型,也代表任何类型。
三.?泛型通配符的特性
1.?作为泛型类型的实际参数,代表这个泛型类型为未知类型。
2.?类型作为泛型类型实际参数,代表这个 泛型代表的类 的 类型为 未知类型。
3.?(未知类型)类型的类,只能取出这个类,并且只能用Object类型接收取出的类。
4.?(未知类型)类型的类,不能为这个类设置值,因为不知道这个类的类型,所以不能把任何一个类的对象赋值给它(大部分人的回答,能取不能设值 -_-! )
四.使用场景(一般配合集合使用)
1.这时就要说到java继承的特性了。
2.有这样一个泛型方法
调用时,传形式参数类型的实际参数,没问题
调用时,传参时,实际参数类型 为 形式参数类型 的子类,没问题,java会自动子类转父类,List并不是List的子类,所以,编译报错
4.这时就要使用到泛型通配符?类,改造方法
调用,都没问题
五.更深入些,通配符的上下界
1.通配符的上限
表示Father类或所有Father类的子类
例,有如下方法:
特性:由于不知道受限制通配符?的具体子类型,所以无法将Father或其子类加入到泛型集合中。
2.通配符的下限
表示Son类或者所有Son类的父类
六.java8的改进类型推断
七.泛型的擦除和转换
1.使用泛型类时没指定泛型类型参数的值,默认为泛型类型的上界类型(没指定上界为Object)
2.当把一个具有泛型信息的对象赋予另一个没有指定泛型信息的对象时,泛型信息将会转为泛型类型的上界类型(没指定上界为Object)
3.
八.泛型数组
1.经量不使用泛型数组,很容易引发ClassCaseException异常
1.?实际参数,也就是使用的时候传的参数,不是定义的时候使用的参数。?关键字不能用在泛型的类型定义上。
二.?详解
1.?是一个通配符,称为泛型通配符。
2.?代表未知的类型,也代表任何类型。
三.?泛型通配符的特性
1.?作为泛型类型的实际参数,代表这个泛型类型为未知类型。
2.?类型作为泛型类型实际参数,代表这个 泛型代表的类 的 类型为 未知类型。
3.?(未知类型)类型的类,只能取出这个类,并且只能用Object类型接收取出的类。
4.?(未知类型)类型的类,不能为这个类设置值,因为不知道这个类的类型,所以不能把任何一个类的对象赋值给它(大部分人的回答,能取不能设值 -_-! )
package test; public class Test1 { public static void main(String[] args) { Person<?> p = new Person(); p.setT(new Object());//此行代码编译出错 Object o = p.getT();//只能用Object类型接收 } } //普通泛型类 class Person<T>{ private T t; public T getT() { return t; } public void setT(T t) { this.t = t; } }
四.使用场景(一般配合集合使用)
1.这时就要说到java继承的特性了。
1.普通类 Object obj = new Object(); String str = new String(); //子类转父类 obj = str;//没问题,Object为String的父类 2.数组 Object[] a_obj = {obj}; String[] a_str = {str}; //子类转父类 a_obj = a_str;//没问题,Object[]为String[]的父类 3.集合 List<Object> l_obj = new ArrayList<>(); List<String> l_str = new ArrayList<>(); //子类转父类 l_obj = l_str;//编译出错,List<Object>并不是List<String>的父类
2.有这样一个泛型方法
public static void test(Object obj, Object[] a_obj, List<Object> l_obj){ }
调用时,传形式参数类型的实际参数,没问题
test(obj, a_obj, l_obj);//没问题
调用时,传参时,实际参数类型 为 形式参数类型 的子类,没问题,java会自动子类转父类,List并不是List的子类,所以,编译报错
test(str, a_str, l_str);//前两个参数有父子关系,没问题。最后一个参数不是父子关系,报错!
4.这时就要使用到泛型通配符?类,改造方法
public static void test(Object obj, Object[] a_obj, List<?> l_obj){ //但是l_obj中的元素只能用Object接收 } 听说List<?> l_obj的默认上界是List<? extends Object>
调用,都没问题
test(obj, a_obj, l_obj);//没问题 test(str, a_str, l_str);//没问题
五.更深入些,通配符的上下界
1.通配符的上限
<? extends Father>
表示Father类或所有Father类的子类
例,有如下方法:
public void test(List<? extends Father> lists){ //无论传Father还是其子类,都不用强转(子类默认可以转父类) for(Father father:lists){//此处仍然只能取元素,不能向lists添加元素 //TODO } }
特性:由于不知道受限制通配符?的具体子类型,所以无法将Father或其子类加入到泛型集合中。
2.通配符的下限
<? super Son>
表示Son类或者所有Son类的父类
六.java8的改进类型推断
七.泛型的擦除和转换
1.使用泛型类时没指定泛型类型参数的值,默认为泛型类型的上界类型(没指定上界为Object)
2.当把一个具有泛型信息的对象赋予另一个没有指定泛型信息的对象时,泛型信息将会转为泛型类型的上界类型(没指定上界为Object)
3.
八.泛型数组
1.经量不使用泛型数组,很容易引发ClassCaseException异常
相关文章推荐
- java 面向对象 之泛型 以及泛型的构造方法 设置多个泛型 通配符
- 泛型高级(通配符) * ?:任意类型,如果没有明确,那么就是Object以及任意的Java类了
- C#和Java的泛型、C++模板、C#的constraints特性以及弱类型化和强类型化的问题(转)
- Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性
- JavaSE_8系列博客——Java语言的特性(六)--泛型(3)--泛型和类型通配符
- JAVA之旅(二十一)——泛型的概述以及使用,泛型类,泛型方法,静态泛型方法,泛型接口,泛型限定,通配符
- java泛型编程学习 笔记三:泛型继承规则以及通配符“?”使用
- JAVA之旅(二十一)——泛型的概述以及使用,泛型类,泛型方法,静态泛型方法,泛型接口,泛型限定,通配符
- Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性
- Java 泛型类型及其子类以及通配符
- Java 泛型总结(三):通配符的使用
- 利用Java5泛型特性实现泛型构件——简单的泛型类和接口
- 18---java中泛型02(通配符)
- Java--泛型的原理以及使用场景
- Java语言规范要求equals方法具有的特性以及实现方式
- java中泛型之类型通配符(?)
- Java 理论与实践: 使用通配符简化泛型使用
- java学习基础泛型和其他对象
- Java 基础加强 - JDK1.5 新特性 - 泛型