泛型
1、 基本概念:
范例:
class Point<T>{//T的类型未知
T x;
T y;
Point(T x, T y){
this.x=x;
this.y=y;
}
public void getPoint(){
System.out.println("x="+x+",y="+y);
}
}
public class StaticClass{
public static void main(String[] args){
Point<Integer> point=new Point<Integer>(1,2);//必须是包装类,不支持基本类型
point.getPoint();
}
}
使用后泛型之后,所有类中属性都是动态设置的,而所有使用反省标记的方法参数类型也都要发生变化。
说明:如果使用泛型类或接口,没有设置泛型具体类型,那么会出现编译时的警告,并且所有泛型或使用object表示。
从jdk1.7可以简化泛型声明:Point<Integer> point=new Point<Integer>(1,2)
等价于Point<Integer> point=new Point<>(1,2)
2、 通配符
?:匹配任意类型
?extends 类:设置泛型上限,可以在声明和方法参数上使用。
例:? extends:可以设置Number或者Number的子类(Integer,Double.......)
?super 类:设置泛型下限,方法参数上使用。
例:? extends String :只能设置String或者它的父类Object。
上限范例:
class Message<T extends Number>{
private T msg;
public void setMsg(T msg){
this.msg=msg;
}
public T getMsg(){
return msg;}}
public class TestDemo{
public static void main(String[] args){
Message<Integer> m=new Message<Integer>();
m.setMsg(100);
fun(m);
}
public static void fun(Message<? extends Number>temp){
System.out.println(temp.getMsg());
}
}
以上代码中,如果出现了非Number或其子类,则会出现语法错误。
下限范例:
class Message<T>{
private T msg;
public void setMsg(T msg){
this.msg=msg;
}
public T getMsg(){
return msg;}}
public class TestDemo{
public static void main(String[] args){
Message<Integer> m=new Message<Integer>();
m.setMsg(100);
fun(m);
}
public static void fun(Message<? extends String>temp){
System.out.println(temp.getMsg());
}
}
3、 泛型接口
interface Message<T>{
public void print(T t);
}
形式一:class MessageImp<T> implements Message<T>{
public void print(T t){
System.out.print(t);
}
}
public class TestDemo{
public static void main(String[] args){
Message<String> m=new MessageImp<String>();
m.print("Hello World");
}}
形式二:
class MessageImp implements Message<String>{
public void print(String t){
System.out.print(t);
}
}
public class TestDemo{
public static void main(String[] args){
Message<String> m=new MessageImp ();
m.print("Hello World");
}}
4、 泛型方法
定义:
范例:
public class TestDemo{
public static void main(String[] args){
String str=fun("Hello World");
System.out.println(str);
}
public static <T>T fun(T t){//T的参数类型由传入值决定
return t;
}
}
5、 总结
1、 泛型解决的是向下转型所带来的安全隐患,其核心的组成就是在声明类或接口的时候不设置参数或属性的类型。
2、 “?”可以接收任意泛型类型,只可取出,不能修改。