我会尽量缩短这个问题的答案。对于长时间的解释,请遵循这个简报。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