1、泛型从JDK1.5之后追加到Java语言里,目的在于解决ClassCastException的问题(在进行对象的向下转型过程中存在的安全隐患)。
2、当同时存在多种数据类型时,首先可以考虑使用Object类接收(装箱与拆箱)。但是Object范围广,在向下转型时会出现问题(编译时正确,执行时报错)。因此当想要避免项目中会出现的“ClassCastException”最好的做法是回避掉对象的强制转换,转而使用泛型技术。
3、泛型的本质在于,类中的属性或方法的参数与返回值的类型可以由对象实例化的时候动态决定。此时,需要在类定义的时候明确定义占位符(泛型标记)。
class Point <T> { //占位符,在对象实例化时决定类型,可以定义多个泛型
private T x ;
……
}
4、关于默认的泛型类型:
由于泛型属于JDK1.5之后的产物,但是在此之前已有不少内置的程序类或接口广泛的应用在了项目开发之中,所以为了保证这些类或接口追加了泛型之后,原始的程序类依然可以使用,所以如果不设置泛型时,自动将使用Object作为类型,以保证程序的正常执行,只是编译时有警告。
5、泛型中只允许设置引用类型,如果要操作基本类型必须使用包装类。Point<Integer> point = new Point()<Integer>;
从JDK1.7开始泛型对象实例化可简化为:Point<Integer> point = new Point()<>;
6、使用泛型可以解决大部分的类对象的强制转换处理。
7、泛型通配符<?>
public class JavaDemo {
public static void main(String[] args) {
Message<Integer> magA = new Message<Integer>() ;
Message<String> magB = new Message<String>() ;
magA.setContent(110) ;
fun(msgA) ; //引用传递
magB.setContent("一只瓶子a") ;
fun(msgB) ;
}
public static void fun(Message<?> temp) {
// temp.setContent("一只瓶子a") ; 错误,使用通配符时,不能修改数据
System.out.print(temp.getContent);
}
}
8、在“?”这个通配符的基础之上还提供有两类小的通配符:
?extends 类:设置泛型的上限,例如:?extends Number表示该泛型类型只允许设置Number或Number的子类。
?super 类:设置泛型的下限,例如:?super String表示只能够使用过String或其父类。
9、泛型接口(泛型可以在类和接口上定义使用)。
在子类中继续设置泛型定义:
package com.demo;
interface IMessage<T> {
public String echo(T t) ;
}
class MessageImpl<S> implements IMessage<S> {
public String echo(S t) {
return "【echo】" + t ;
}
}
public class JavaDemo {
public static void main(String[] args) {
IMessage<String> msg = new MessageImpl<String>() ; //向上转型
System.out.print(msg.echo("一只瓶子a"));
}
}
在子类实现父接口的时候直接定义出具体泛型类型:
package com.demo;
interface IMessage<T> {
public String echo(T t) ;
}
class MessageImpl implements IMessage<String> {
public String echo(String t) {
return "【echo】" + t ;
}
}
public class FanXing {
public static void main(String[] args) {
IMessage<String> msg = new MessageImpl() ; //向上转型
System.out.print(msg.echo("一只瓶子a"));
}
}
10、泛型方法(很常见)
如果将泛型标记写在了方法上,那么这样的方法就被称为泛型方法。泛型方法不一定非要出现在泛型类之中。
public static void main(String[] args) {
Integer num [] = fun(1,2,3) ;
for(int temp : num) {
System.out.print(temp);
}
}
public static <T> T[] fun(T ...args) { //返回值类型是T类型数组
return args ;
}