疯狂-泛型
2017-08-13 16:10:34 35 举报
AI智能生成
疯狂java讲义,泛型这一章内容,看开源框架,泛型肯定有,需要系统的学习
作者其他创作
大纲/内容
泛型入门
java 7 泛型的“< >”语法
java 7 以前:
List<String> strList = new ArrayList<String>();
从java7开始:
List<String> strList = new ArrayList<>(); (系统会推断)
List<String> strList = new ArrayList<String>();
从java7开始:
List<String> strList = new ArrayList<>(); (系统会推断)
深入泛型
定义泛型接口、类
可以为任何类、接口增加泛型声明
ps : public class Apple<T>
ps : public class Apple<T>
Apple<T> 类虽然定义了泛型,但是构造器的定义是不需要 < > 的:
public Apple(T info) {
this.info = info
}
但是在使用时需要 < > : Apple<String> a1 = new Apple<>("苹果");
public Apple(T info) {
this.info = info
}
但是在使用时需要 < > : Apple<String> a1 = new Apple<>("苹果");
从泛型类派生子类
1.当接口或父类有泛型定义,则实现类或子类不能再包含泛型,必须明确类型,或者不加泛型
public class A extends Apple<T>{} (错)
public class A extends Apple<String>{} (对) : 子类继承到的父类方法中,用到泛型的地方都是String类型
public class A extends Apple{} (对) : 子类继承到的父类方法中,用到泛型的地方都是object类型
public class A extends Apple<T>{} (错)
public class A extends Apple<String>{} (对) : 子类继承到的父类方法中,用到泛型的地方都是String类型
public class A extends Apple{} (对) : 子类继承到的父类方法中,用到泛型的地方都是object类型
并不存在的泛型类
泛型类并没有生成新的class文件,还是之前的类class。因此,不可以在静态方法、静态代码块、静态变量中使用泛型
类型通配符
当使用一个泛型类时(声明变量和创建对象),都必须要传入一个类型实参
Student类是 Person类的子类,但是List<Student>并不是List<Person>的子类,但是
Student[] 是 Person[] 的子类。
Student[] 是 Person[] 的子类。
使用类型通配符
List<?>是所有List泛型的父类,但是List<?>并不能添加元素。
设定类型通配符上限
List<? extends Person>:表示所有继承了Person类的List泛型的父类
设定类型形参的上限
public class Person<T extends Number>
可以设定多个类型形参上线(最多一个父类上限,多个接口上限),表示类型形参必须是父类或父类的子类,并实现多个上限接口。
public class Person<T extends Number & java.io.Serializable>
public class Person<T extends Number & java.io.Serializable>
泛型方法
类型形参:就是在定义类和接口时,设定的一个变量T,在该类或接口中可以当成变量使用。
定义泛型方法
泛型方法 : 在申明方法时定义一个或多个类型形参。
修饰符 <T, S> 返回值类型 方法名(形参列表) {
//方法体
}
修饰符 <T, S> 返回值类型 方法名(形参列表) {
//方法体
}
可以设定多个类型形参上线(最多一个父类上限,多个接口上限),表示类型形参必须是父类或父类的子类,并实现多个上限接口。
public class Person<T extends Number & java.io.Serializable>
public class Person<T extends Number & java.io.Serializable>
与在接口、类声明中定义的类型形参不同,方法中定义的类型形参只能在该方法里使用。
泛型方法和类型通配符的区别
如果方法的参数或返回值依赖另外一个参数的类型,则应该使用类型形参(类型形参)
public <T> void copy(List<T> dest, List<? extends T> src);
public <T, S extends T> void copy(List<T> dest, List<S> src);
public <T, S extends T> void copy(List<T> dest, List<S> src);
Java 7 的“菱形”语法与泛型构造器
菱形语法,可以省略实际的类型形参,但是如果明确指定了类型形参,则不可省略
pg : mc = new <Integer> myClass(5) (yes)
mc = new myClass<>(5) (yes, 菱形语法)
mc = new <Integer> myClass<>(5) (no)
pg : mc = new <Integer> myClass(5) (yes)
mc = new myClass<>(5) (yes, 菱形语法)
mc = new <Integer> myClass<>(5) (no)
审定通配符下限
<? super Type> : 表示必须是Type本身,或是Type的父类
泛型方法与方法重载
public static <T> void copy(Collection<T> dest, Collection<? extends T> src)
public static <T> T copy(Collection<? super T> dest, Collection<T> src)
会引发编译错误,
public static <T> T copy(Collection<? super T> dest, Collection<T> src)
会引发编译错误,
Java 8 改进的类型推断
擦除和转换
当把一个具有泛型信息的对象赋予赋予另一个没有泛型信息的变量时,泛型信息将被扔掉
且,类型会变成类型参数的上限
List<String> ls = new ArrayList<>();
List list = ls (擦除)
且,类型会变成类型参数的上限
List<String> ls = new ArrayList<>();
List list = ls (擦除)
泛型和数组
如果代码在编译时没有提出 unchecked警告,则程序在运行时不会引发 ClassCastException异常
0 条评论
下一页