zoukankan      html  css  js  c++  java
  • 泛型 通配符 泛型接口

    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") ;
    	}
    	
    }
    
  • 相关阅读:
    【.net】未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序解决办法
    【JS】JavaScript中Null和undefind区别
    【SQL】SQL中on条件与where条件的区别
    【C#】C#创建自定义Object对象
    【.NET】asp.net Redirect 图片路径
    【JQ】jq动态绑定事件.on()、解绑事件off()
    【.NET】using 语句中使用的类型必须可隐式转换为"System.IDisposable"
    C# enum、int、string三种类型互相转换
    js中Date与timestamp(时间戳)的相互转换
    2. 自动化运维系列之Cobbler给Openstack节点安装操作系统。
  • 原文地址:https://www.cnblogs.com/da-peng/p/5170481.html
Copyright © 2011-2022 走看看