泛型 通配符 泛型接口

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") ;
	}
	
}
原文地址:https://www.cnblogs.com/da-peng/p/5170481.html