2011-01-20 25 views
0

私は2つのクラスがあります:あなたが見ることができるようにJava:戻り値を自動的にキャストする方法はありますか?

public abstract class Arguments { 
    public List execute() { 
     // do some stuff and return a list 
    } 
} 

// and a child : 
public class ItemArguments { 
    public List<Item> execute() { 
     return super.execute(); 
    } 
} 

を、方法ItemArgumentsで実行するには、あまり役に立たないですが、それなしで、私は、引数にexecuteメソッドにすべての私のコールをキャストする必要があります。

ItemArgumentsでexecuteメソッドを削除し、呼び出しが行われる場所でキャストを実行しないようにする方法はありますか?

ありがとうございました!

答えて

10

ジェネリック

public abstract class Arguments<T> { 
    public List<T> execute() { 
    // some stuff 
    return new ArrayList<T>(); 
    } 
} 

public class ItemArguments extends Arguments<Item> { 

} 

あなたDO n'tも、必要にサブクラスない限り、あなたしている他の理由んので、

public class Arguments<T> { 
    public List<T> execute() { 
    // blah 
    } 
} 

Arguments<Item> o1 = new Arguments<Item>(); 
List<Item> o2 = o1.execute(); 

呼び出し方法についてのTではありませんそれほど単純明快。 Tはコンパイラによって消去されるため、実行時には利用できません。あなたは引数

public class Foo { 
    public static void something() { ... } 
} 

public class Arguments<T extends Foo> { 
    private Class<? extends Foo> foo; 
    public Arguments(Class<? extends Foo> foo) { 
    this.foo = foo; 
    } 
    public List<T> execute() { 
    foo.something(); 

    } 
} 

より良い方法がありますをインスタンス化する場合の回避策を理解しやすいが、クラスに渡すことですが、これはパターンマスター:)

+0

グレートすることなく、ほとんどが理解しやすいです!完璧!ありがとう!!! :) –

+0

それから受け入れる:)(ちょうちょをクリックして) – ptomli

+0

ちょっと質問:私はTをどのように使うことができますか? T.にある静的メソッドを呼び出す必要があります。良い方法はReflectionを使用することですが、T.getDeclaredMethodは動作していません。/ –

関連する問題