2013-07-29 79 views
8

有人可以解釋爲什麼這將編譯JDK 1.6,但不是在JDK 1.7從中我得到的錯誤信息:的Java 7,但不是Java 6:「不是抽象的,不重寫抽象方法」

java:示例不是抽象的,並且不會覆蓋java.lang.Comparable中的抽象方法compareTo(java.lang.Object)?

import java.util.concurrent.*; 

public class Example implements ScheduledFuture 
{ 
    @Override public long getDelay(TimeUnit unit){ return 0; } 
    @Override public int compareTo(Delayed o) { return 0; } 
    @Override public boolean cancel(boolean mayInterruptIfRunning) { return false; } 
    @Override public boolean isCancelled() { return false; } 
    @Override public boolean isDone() { return false; } 
    @Override public Object get() throws InterruptedException, ExecutionException { return null; } 
    @Override public Object get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { return null; } 
} 

爲了您的信息,被寫的IntelliJ只類聲明後生成的這個類中的方法。

錯誤消息指示編譯器要求該類聲明一個compareTo方法,該方法需要一個Object類型的參數,並且該類需要Delayed。 但是,ScheduledFuture接口被定義爲擴展Delayed,這反過來又擴展了Comparable<Delayed>所以對我來說一切似乎都是按順序的。

如果我只是改變了聲明

private class Example implements ScheduledFuture<Object> 

它編譯。

我猜它與某種類型的擦除有關,但我無法真正解釋它來滿足自己。

+1

我在你的地方會查找1.6和1.7中的ScheduledFuture的javadoc,並檢查發生了什麼變化。 – Ingo

+0

它發生在我身上,Java 6不會阻止來自參數化類的原始類型繼承,而是7 – fglez

回答

10

我真的不知道爲什麼Java 6Java 7之間的行爲改變(你驗證和其它編譯器?javac與Eclipse的編譯器與任何IDEA使用?)。

但我可以告訴你,爲什麼不compareTo(Delayed)實現compareTo(Object)你延長ScheduledFuture

使用ScheduledFuture,你使用a raw type,這意味着所有出現仿製藥的在幾乎忽略不計你的班。這意味着,你現在實現Comparable(不再Comparable<Delayed>,這反過來又意味着你需要實現compareTo(Object)(的Comparable<Delayed>.compareTo()擦除),但要實現compareTo(Delayed)

記住:原始類型意味着只有向後兼容。不惜一切代價,當你改變你的extends子句ScheduledFuture<Object>避免他們在新的代碼,他們做壞事!

您「選擇加入」的仿製藥系統和編譯器的最終實現(即「被允許認識到「)你的compareTo(Delayed)實際上是Comparable<Delayed>接口的正確實現。

+1

+1:這肯定是由於使用原始類型而導致的,這意味着所有泛型都被忽略。 –

+0

我只使用了Java HotSpot編譯器1.6.0_43和1.7.0_25。 –

+0

@ThomasLarssonKron:「HotSpot」是JVM,它不是編譯器。您可能已經從這些Java版本使用了'javac'。 –

相關問題