[英]Java generics - Supertype references
如果我正確理解了泛型,則可以使用參數聲明為<? super T>
的方法<? super T>
<? super T>
將接受的是任一類型的任何參考T
或超類型的T
。 我正在嘗試使用以下代碼進行測試,但編譯器不喜歡它。
class Animal{}
class Dog extends Animal{}
class Cat extends Animal{}
class ZiggyTest2{
public static void main(String[] args){
List<Animal> anim2 = new ArrayList<Animal>();
anim2.add(new Animal());
anim2.add(new Dog());
anim2.add(new Cat());
testMethod(anim2);
}
public static void testMethod(ArrayList<? super Dog> anim){
System.out.println("In TestMethod");
anim.add(new Dog());
//anim.add(new Animal());
}
}
編譯器錯誤是:
ZiggyTest2.java:16: testMethod(java.util.ArrayList<? super Dog>) in ZiggyTest2 cannot be applied to (java.util.List<Animal>)
testMethod(anim2);
^
1 error
我不明白為什么我不能通過anim2,因為它是<Animal>
類型,而Animal是Dog的超級類型。
謝謝
您試圖將類型List<>
的表達式傳遞到類型ArrayList<>
的參數中。 不上班
這條線
public static void testMethod(ArrayList<? super Dog> anim){
應該
public static void testMethod(List<? super Dog> anim){
要么
List<Animal> anim2 = new ArrayList<Animal>();
應該
ArrayList<Animal> anim2 = new ArrayList<Animal>();
您是否嘗試過<? extends Dog>
<? extends Dog>
?
還可以問為什么您使用ArrayList<? super Dog>
ArrayList<? super Dog>
而不是ArrayList<Animal>
嗎? 也許這個例子只是您要嘗試做的一個簡單形式,但似乎過於復雜了。
這是泛型的基本示例。 希望能幫助到你。
class Animal{
public sleep(){}
}
class Dog extends Animal{
public sleep(){
log("Dog sleeps");
}
}
class Rabbit extends Animal{
public sleep(){
log("Rabbit sleeps");
}
}
class Place<T>{
T animal;
}
class Kennel extends Place<Dog>{
public Kennel(Dog dog){
super();
this.animal = dog;
}
}
class Hutch extends Place<Rabbit>{
public Kennel(Rabbit rabbit){
super();
this.animal = rabbit;
}
}
可以在這里找到有關Java泛型的不錯的文檔/簡介。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.