質問にはあまり答えられていないので、私は短くしようとします。長い説明のために、このブリーフィングを行ってください。Java Generics Silly Thing(なぜ私は型を推測できないのですか?)
私は何をしようとしているかを示します。 (戻り値の型など、別の方法を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を必要としないクラスを表す冗長性が低い場合は型の安全です。
私は特定の動作についてジェネリックスを使用して評価しています。私はそれを働かせることができたが、なぜ私はargからタイプを推測することができないのか理解していない。そこで、実際のアーキテクチャを単純化する目的で警告なしでokを実行するこのサンプルを作成しました。
(最後の2行は、高速ブリーフィングのためのスニペットを直接見て)
は、私はこの2つのクラスを得たとします。ターゲット1:
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は大きなANGの巨人にはないタコは水生メディアを必要とする/ 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のタイプを避けるために、何らかの方法(タイプ/ジェネリックとsupressingWarningsもキャスティングも使用しないでください)がありますか?私は、getHerdLeaderの戻り値にZooCageのコンストラクタargから型の推論を得るために何千もの方法を試しました。コンストラクタに期待される型がある場合、ZooCageを型定義する必要はありません。重複しているようで、あなたはあらかじめそのタイプを知っている必要があります!
大変ありがとうございました!
どの部分、まさにあなたは避けようとしていますか?あなたは「タイプ化を避ける」ことは何を意味しますか? –