java中泛型之型別萬用字元(?)
實體類
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
相關文章
- Java 泛型中的萬用字元Java泛型字元
- java泛型之萬用字元的使用。Java泛型字元
- 泛型類、泛型方法、型別萬用字元的使用泛型型別字元
- 泛型--泛型萬用字元和泛型的上下限泛型字元
- 泛型概述-萬用字元泛型字元
- Java™ 教程(泛型萬用字元使用指南)Java泛型字元
- Java泛型(類、介面、方法)及萬用字元Java泛型字元
- 集合框架-泛型高階之萬用字元框架泛型字元
- java泛型之泛型方法。Java泛型
- java泛型之泛型陣列。Java泛型陣列
- Java中建立泛型型別的例項Java泛型型別
- 使用萬用字元增強泛型字元泛型
- JAVA基礎之九-泛型(通用型別)Java泛型型別
- Java™ 教程(泛型原始型別)Java泛型型別
- Java泛型與型別擦除Java泛型型別
- 泛型無界萬用字元<?>的思考泛型字元
- Java泛型型別擦除問題Java泛型型別
- Java中的泛型Java泛型
- 【MySQL資料型別3之--字元型別】MySql資料型別字元
- 【java】【泛型】泛型geneticJava泛型
- 型別 VS 泛型型別泛型
- TypeScript 泛型型別TypeScript泛型型別
- JAVASE之JAVA泛型篇Java泛型
- 泛型類、泛型方法及泛型應用泛型
- Java泛型知識點:泛型類、泛型介面和泛型方法Java泛型
- Java 泛型,你瞭解型別擦除嗎?Java泛型型別
- Java中基於泛型的交叉型別 - {4Comprehension}Java泛型型別
- Python之字元型別Python字元型別
- Java中的泛型方法Java泛型
- Go 泛型之泛型約束Go泛型
- 泛型型別(.NET 指南)泛型型別
- Java 泛型Java泛型
- Java泛型Java泛型
- java泛型中<?>和<T>有什麼區別?Java泛型
- Java基礎之泛型方法Java泛型
- Java核心之細說泛型Java泛型
- Java泛型應用淺析Java泛型
- Java 中泛型的協變Java泛型