2011-01-20 57 views
0

我有兩個類: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(); 
    } 
} 

正如你所看到的,方法execute ItemArguments是有點用處,但沒有它,我一定要投我以參數的執行方法的所有調用。

有沒有辦法刪除ItemArguments中的execute方法,並避免在調用時進行強制轉換?

感謝您的幫助!

回答

10

泛型

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

public class ItemArguments extends Arguments<Item> { 

} 

你甚至都不需要繼承,除非你有其他的理由這樣做對T這樣

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

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

調用方法並非如此簡單。 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

太好了!完善!!謝謝!!! :) – 2011-01-20 08:46:26

相關問題