39java泛型(通配符)

38 阅读2分钟

泛型(通配符)

一、介绍通配符

虽然在程序类中追加有泛型的定义后避免了

ClassCastException的问题,但是又会产生新的情况:参数的统一问题

 

范例:观察如下的一段程序。

public class TestDemo {

   public static void main(String[] args) }

      Message<String> msg = new Message<String>() ;

      msg.setNote(“天天很帅气!”);

      fun(msg) ;

   }

   public static void fun(Message<String> temp) {

       System.out.println(temp.getNote()) ;

}

}

 

但是这样会带来一个新的问题,如果现在泛型的类型设置的不是String,而是Inteager(泛型类型只允许设置类和接口,而不能够使用基本数据类型)。

 

范例:错误的代码

public class TestDemo {

   public static void main(String[] args) }

      Message<Integer> msg = new Message<Integer>() ;

      msg.setNote(99);

      fun(msg)//出现错误

 

因为只能用String

   }

   public static void fun(Message<String> temp) {

       System.out.println(temp.getNote()) ;

}

}

 

 

 

这个时候分析,泛型的类型给人造成了困扰,所以就可以不设置泛型。


public class TestDemo {

   public static void main(String[] args) }

      Message<Integer> msg = new Message<Integer>() ;

      msg.setNote(99);

      fun(msg)//出现错误,因为只能用String

   }

  //如果没有设置泛型类型,默认用的类型就是Object

 public static void fun(Message<String> temp) {

     temp.setNote(“天天很帅气”);

       System.out.println(temp.getNote()) ;

}

}

所以得出结论,我们需要的解决方案:可以接收所有的泛型类型,但是又不能够让用户任意修改。

那么就需要通配符来实现,使用“?”来处理。

public class TestDemo {

   public static void main(String[] args) }

      Message<Integer> msg = new Message<Integer>() ;

      msg.setNote(99);

      fun(msg)//出现错误,因为只能用String

   }

  //此时使用的是通配符“?”描述的是它可以接收任意类型,但是由于不确定类型,所以无法修改

 public static void fun(Message<?> temp) {

     temp.setNote(“天天很帅气”);

       System.out.println(temp.getNote()) ;

}

}

而在“?”的基础上又产生了两个子通配符:

  • ?extends类:设置泛型上限:

    例如:?extends Number,表示只能设置Number或其子类,例如:Integer、Double等;

  • ?super类:设置泛型下限:

   例如:?super String,表示只能设置String或其父类:Object。

 


二、范例:观察泛型上限

package cn.mldn.demo;

class Message<T extends Number> { //设置泛型上限

private T nate ;

public void setNote(T note) {

   this.note = note;

}

public T getNote() {

    return note;

}

}

public class TestDemo {

   public static void main(String[] args) }

      Message<Integer> msg = new Message<Integer>() ;

      msg.setNote(99);

      fun(msg)//出现错误,因为只能用String

   }

  //此时使用的是通配符“?”描述的是它可以接收任意类型,但是由于不确定类型,所以无法修改

 public static void fun(Message<?> temp) {

temp.setNote(“天天很帅气”);

       System.out.println(temp.getNote()) ;

}

}