2013-09-25 62 views
8
public interface Expression { 

} 

public interface ArithmeticExpression extends Expression { 

} 


public class StaticMethodDemo { 
    public static void print(Expression e) { 
    System.out.println("StaticMethodDemo"); 
    } 

    public static List<Expression> convert(
     Collection<? extends Expression> input) { 
    return null; 
} 
} 


public class StaticMethodChild extends StaticMethodDemo { 

    public static void print(ArithmeticExpression e) { 
    System.out.println("StaticMethodChild"); 
    } 

    public static List<ArithmeticExpression> convert(
     Collection<? extends ArithmeticExpression> input) { 
    return null; 
    } 
} 

上面的代碼在java 5中編譯但不在java 7中爲什麼?在Java 7中,它給出了「Name衝突:類型StaticMethodChild的方法convert(Collection)與類型爲StaticMethodDemo的convert(Collection)具有相同的擦除但不隱藏它」名稱在java 7中編譯時發生衝突編譯錯誤,但在java中運行正常5

回答

2

Java不允許重寫靜態方法。請參閱Why doesn't Java allow overriding of static methods?

您唯一能做的就是在子類中隱藏一個靜態方法。隱藏意味着它不依賴於被調用的對象類型,而是依賴於什麼類型的類。見http://docs.oracle.com/javase/tutorial/java/IandI/override.html

現在的問題是,你的子類方法具有正式相同的簽名,但由於泛型類型,它不會隱藏它。 Collection<? extends ArithmeticExpression>既不相同,也不是Collection<? extends Expression>的子類型,實際上可以防止正確的,不可知的隱藏。正如Ayobi指出的,編譯器規則是爲了確保向後兼容性而引入的:Method has the same erasure as another method in type

現在不能爲我自己嘗試,但當兩者具有相同的泛型類型時,錯誤應該消失。儘管我不知道爲什麼Java 5中不會出現這種錯誤,但我想他們在後來的版本中引入了編譯規則,因爲他們之前沒有注意到它。

+0

謝謝你的解釋。目前我正在開發一個項目,在這個項目中,我們正在遷移到Java 7,並且大量的類都有這個問題。除此之外,我還面臨着具有vargs的方法的問題。 – Dragon

+0

您應該重新初始化所有這些類,因爲這是錯誤的來源。 –

4

除了stonedsquirrel的答案,即使方法不是靜態的,你也會得到相同的錯誤。

這是因爲類型擦除,你會試圖重寫與不兼容類型的轉換。

查看以下answer一個很好的解釋。

+0

另一個鏈接的答案不是與OP相同的錯誤,其他答案的確很好地談論了類型刪除,但它並不涉及靜態方法和錯誤的關鍵位,它是「但不會隱藏它」 –