java中泛型之型別萬用字元(?)

weixin_33766168發表於2017-11-21

實體類

package cn.xy.model;

/**
 * 生物類
 * @author xy
 * 
 */
public class Living
{
 private String name;

 public Living(String name)
 {
  super();
  this.name = name;
 }

 public String getName()
 {
  return name;
 }

 public void setName(String name)
 {
  this.name = name;
 }

 @Override
 public String toString()
 {
  return name;
 }
}

 

/**
 * 動物類
 * @author xy
 * 
 */
public class Animal extends Living
{
 public Animal(String name)
 {
  super(name);
 }
}

 

/**
 * 貓類
 * @author xy
 *
 */
public class Cat extends Animal
{
 public Cat(String name)
 {
  super(name);
 }
}


/**
 * 狗類
 * @author xy
 *
 */
public class Dog extends Animal
{
 public Dog(String name)
 {
  super(name);
 }
}

 

測試類1

import java.util.ArrayList;
import java.util.List;
import cn.xy.model.Animal;
import cn.xy.model.Cat;
import cn.xy.model.Dog;
import cn.xy.model.Living;

public class Test
{


 /**
  * 雖Cat和Dog是Animal的子類,但List<Cat>和List<Dog>不是List<Animal>的子類,直接為該方法傳入List<Cat>和List<Dog>編譯會錯誤。如List<Stirng>不是List<Object>的子類一樣。
  */
 public static void GetNames1(List<Animal> animals)
 {
  for (Animal a : animals)
  {
   System.out.println(a.getName());
  }
 }

 

 /**
  * 該方法使用型別萬用字元,可以使用任何型別的List來呼叫它,其型別均為Object
  */
 public static void GetNames2(List<?> animals)
 {
  for (Object obj : animals)
  {
   Animal a = (Animal) obj;
   System.out.println(a.getName());
  }
 }

 

 /**
  * 該方法設定了型別萬用字元的上限,即傳入的List的型別必須是Animal的子類或者Animal本身
  */
 public static void GetNames3(List<? extends Animal> animals)
 {
  for (Animal a : animals)
  {
   System.out.println(a.getName());
  }
 }

 

 /**
  * 該方法設定了型別萬用字元的下限,即傳入的List的型別必須是Animal的父類或者Animal本身
  */
 public static void GetNames4(List<? super Animal> animals)
 {
  for (Object a : animals)
  {
   System.out.println(a);
  }
 }

 public static void main(String[] args)
 {
  List<Cat> cats = new ArrayList<Cat>();
  cats.add(new Cat("Tomcat"));
  cats.add(new Cat("Tomcat2"));

  List<Dog> dogs = new ArrayList<Dog>();
  dogs.add(new Dog("Tomdog"));
  dogs.add(new Dog("Tomdog2"));

  List<Living> livings = new ArrayList<Living>();
  livings.add(new Living("living1"));
  livings.add(new Living("living2"));

  // GetNames1(cats);
  // GetNames1(dogs);
  GetNames2(cats);
  GetNames2(dogs);
  GetNames3(cats);
  GetNames3(dogs);
  // GetNames4(cats);
  // GetNames4(dogs);
  GetNames4(livings);

 }
}


測試類2

import java.util.ArrayList;
import java.util.List;

public class Test2
{

 /**
  * 新增的物件必須是和?一樣的型別或者是其子類,但並不知道?是什麼型別。所以lst.add會產生編譯錯誤,故不能向其中新增。物件null值是一個例外,因為null是所有引用型別的例項。
  */
 public static void main(String[] args)
 {
  List<?> lst = new ArrayList<String>();
  // lst.add("str");
 }

}

本文轉自IT徐胖子的專欄部落格51CTO部落格,原文連結http://blog.51cto.com/woshixy/1030106如需轉載請自行聯絡原作者


woshixuye111

相關文章