2012-09-01 41 views
2

假設我有一個類Foo像這樣:可變參數與Java繼承

public class Foo<T> { 
    protected T invoke(Object... args); 
} 

現在假設我補充一點:

public class Bar<T, Arg> extends Foo<T> { 
    public T invoke(Arg arg); 
} 

這是否意味着我不能創建一個Bar<T, Object[]>因爲它會創建兩個invoke()方法與「本質上」相同的簽名?或者在這種情況下Bar.invoke()安全地隱藏Foo.invoke()(因爲Bar.invoke()是運行方式,取Object而不是Object[]Foo.invoke())?

與此相關:正在轉發Bar.invoke()Foo.invoke()安全和罰款?

+0

你想解決什麼問題?這看起來比任何SCJP問題都難。 – Adam

回答

1

Bar.invoke不覆蓋Foo.invoke。如果你只打電話bar.invoke而沒有參數,你會得到foo.invoke

但是,如果你構建一個Bar對象,你會得到一個編譯時錯誤(reference to invoke is ambiguous):Bar<Object, Object[]> bar = new Bar<Object, Object[]>(),然後調用bar.invoke(new Object[]{})因爲2種調用方法都在運行同一消失。