泛型 通配符 泛型接口
package cn; class Message <T> { private T msg ; public T getMsg() { return msg; } public void setMsg(T msg) { this.msg = msg; } } public class Test { public static void main(String[] args) { Message <String > m = new Message<String>() ; m.setMsg("Hello world ") ; fun(m) ; } public static void fun(Message <String> temp){ System.out.println(temp.getMsg()) ; } }
以上的代码为Message设置的是String对象类型
如果设置成:
Message <Integer > m = new Message<Integer>() ; m.setMsg(100) ;
则fun()函数出错误了
解决方法1. 不设置参数的参数
public static void fun(Message temp){
但是出现的问题是:
public static void fun(Message temp){ temp.setMsg("Hello") ; · //变成了String类型 System.out.println(temp.getMsg()) ; }
所以现在要做的只能是让数据只能取出不能设置
public static void fun(Message <?> temp){
使用 “ ? ”
. ?extends类 : 设置泛型上限
比如 ? extends Number : 可以设置 Number 的子类(Integer ,Doub)等
package cn; class Message <T extends Number> { private T msg ; public T getMsg() { return msg; } public void setMsg(T msg) { this.msg = msg; } } public class Test { public static void main(String[] args) { Message <Integer > m = new Message<Integer>() ; Message <Double> m1 = new Message<Double>() ; m.setMsg(100) ; fun(m) ; } public static void fun(Message <? extends Number> temp){ System.out.println(temp.getMsg()) ; } }
. ?super 类 : 设置泛型下限
比如 ?super : 设置String 或者他的父类 (Object) 等
接口
定义接口的时候要定义子类,
1.在子类设置泛型
//如果是接口在前面加上字母I ,例如IMessage //如果是抽象类加上Abstract,例如AbstractMessage interface IMessage <T>{ public void print(T t ) ; } class MessageImpl <T> implements IMessage<T>{ public void print(T t){ System.out.println(t) ; } } public class Test { public static void main(String[] args) { IMessage <String > msg = new MessageImpl<String>() ; msg.print("hello") ; } }
2.在子类不设置泛型
interface IMessage <T>{
public void print(T t ) ;
}
class MessageImpl implements IMessage<String>{
public void print(String t){
System.out.println(t) ;
}
}
public class Test {
public static void main(String[] args) {
IMessage <String > msg = new MessageImpl() ;
msg.print("hello") ;
}
}