我會盡量縮短這個問題的答案。對於長時間的解釋,請遵循這個簡報。Java泛型愚蠢的事情(爲什麼不能推斷這種類型?)
我會顯示我在做什麼。事情是這樣的(爲了在另一種方法getLeaderHerd作爲返回類型使用它從構造infering輸入型)...:
public class ZooCage{
private CageFamily<T> inhabitants;
public <T>ZooCage(CageFamily<T> herd) {
this.inhabitants=herd;
}
public T getHerdLeader() {
return inhabitants.getLeader();
}
}
或本
public class ZooCage{
private (Type) T;
public ZooCage(CageFamily<T> herd) {
this.T=T;
}
public T getHerdLeader() {
return inhabitants.getLeader();
}
}
,所以我可以從打電話主要是這樣的:
ZooCage cage = new ZooCage(new CageFamily<Lion>()); //Imagine new CageFamily its not empty
Lion leader = cage.getHerdLeader();
即使它不可能,爲什麼我認爲這是不合理的功能?它的類型安全,如果編譯器是智能的並且沒有冗餘的類型ZooCage不是必需的類型
我,m評估使用泛型爲特定行爲。我設法得到它的工作,但我不明白爲什麼不能從arg中推斷出這種類型。所以我創建了這個示例,它可以在沒有警告的情況下正常運行,以簡化實際的體系結構。
(直接看最後2行片斷的快速簡報)
想我得到了這兩個類。目標之一:
package Zoo;
import Zoo.Main.CageFamily;
import Zoo.Main.Vertebrate;
public class ZooCage<T extends Vertebrate>{
private CageFamily<T> inhabitants;
public ZooCage(CageFamily<T> herd) {
this.inhabitants=herd;
}
public T getHerdLeader() {
return inhabitants.getLeader();
}
}
試想一下,在籠子裏只能有脊椎動物(昆蟲/ aracnids並不大昂巨頭quids /章魚需要水介質)
另外一類,Main.java
package Zoo;
import java.util.ArrayList;
public class Main {
public static void main(String[] args){
new Main().test();
}
public void test(){
CageFamily<Lion> lionsHerd = new CageFamily<Lion>();
lionsHerd.add(new Lion("Simba"));
lionsHerd.add(new Lion("Nala"));
CageFamily<Bear> bearsHerd = new CageFamily<Bear>();
bearsHerd.add(new Bear("Yogi"));
bearsHerd.add(new Bear("Boo-boo"));
ZooCage<Lion> cageLions = new ZooCage<Lion>(lionsHerd);
ZooCage<Bear> cageBears = new ZooCage<Bear>(bearsHerd);
for (ZooCage<?> cage : new ZooCage[]{cageLions,cageBears})
System.out.println("The leader is "+ cage.getHerdLeader());
}
public interface Vertebrate{
public String toString();
public int numBones();
}
public class Lion implements Vertebrate{
private String name;
public Lion (String name){this.name=name;}
public String toString(){return name + " (who has "+numBones()+" bones)";}
public int numBones(){return 345;}
}
public class Bear implements Vertebrate{
private String name;
public Bear (String name){this.name=name;}
public String toString(){return name + " (who has "+numBones()+" bones)";}
public int numBones(){return 658;}
}
public class CageFamily<E extends Vertebrate> extends ArrayList<E>{
final static long serialVersionUID = 1L;
public E getLeader(){
return get(0); //Let,s assume the first added is the leader
}
}
}
這編譯OK並打印
The leader is Simba (who has bones)
The leader is Yogi (who has bones)
什麼我想知道的是:是有沒有辦法(只使用類型/泛型,沒有抑制威望或鑄件)來避免類ZooCage作爲一個整體的類型化?我嘗試了幾千種方法來從ZooCage的構造函數arg中得到對getHerdLeader的返回值的推斷。當他的構造函數帶有預期類型時,應該沒有必要對ZooCage進行典型化。看起來多餘,讓你不得不事先知道類型!
非常感謝所有能夠幫助的人!
你試圖避免什麼部分? 「避免典型化」是什麼意思? – 2012-04-24 00:46:01
避免在類的ZooCage定義中指定,所以我必須使用它作爲ZooCage = new ZooCage 。編號喜歡從構造函數中的傳入類型推斷getHerdLeader的返回類型。我的意思是返回T,它是CageFamily arg傳入的T,並僞造泛型的類定義。 –
Whimusical
2012-04-24 00:48:45