2013-07-29 29 views
8

Ai đó có thể giải thích tại sao điều này biên dịch trong JDK 1.6, nhưng không phải trong JDK 1.7 từ mà tôi nhận được thông báo lỗi:Java 7 nhưng không phải Java 6: "không phải là trừu tượng và không ghi đè phương pháp trừu tượng"

java: Ví dụ không trừu tượng và không ghi đè lên phương thức trừu tượng compareTo (java.lang.Object) trong java.lang.Comparable?

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; } 
} 

Để biết thông tin của bạn, các phương pháp trong lớp này được tạo ra bởi IntelliJ sau khi viết chỉ khai báo lớp.

Thông báo lỗi cho biết trình biên dịch yêu cầu lớp đó khai báo phương thức compareTo có tham số được nhập Object và lớp này mất Delayed. Tuy nhiên, giao diện ScheduledFuture được định nghĩa là mở rộng Delayed mà lần lượt mở rộng Comparable<Delayed> vì vậy với tôi mọi thứ dường như theo thứ tự.

Nếu tôi chỉ cần thay đổi việc kê khai để

private class Example implements ScheduledFuture<Object> 

nó biên dịch.

Tôi đoán nó có liên quan đến việc xóa kiểu bằng cách nào đó nhưng tôi không thể giải thích nó để thỏa mãn bản thân mình.

+1

Tôi ở vị trí của bạn sẽ tìm kiếm javadoc cho ScheduledFuture từ 1.6 và 1.7 và kiểm tra những gì đã thay đổi. – Ingo

+0

Nó xảy ra với tôi rằng Java 6 không ngăn chặn thừa kế kiểu thô từ các lớp được parametrized trong khi 7 không – fglez

Trả lời

10

Tôi thực sự không biết tại sao thay đổi hành vi giữa Java 6Java 7 (bạn đã xác minh rằng với các trình biên dịch khác? javac so với trình biên dịch Eclipse so với IDEA sử dụng?).

Nhưng tôi có thể cho bạn biết lý do tại sao compareTo(Delayed) không không thực hiện compareTo(Object) khi bạn mở rộng ScheduledFuture:

Bằng cách sử dụng ScheduledFuture, bạn đang sử dụng a raw type, có nghĩa là tất cả các lần xuất hiện Generics được khá nhiều bỏ qua trong lớp của bạn. Điều đó có nghĩa rằng bạn đang thực hiện Comparable (và không còn Comparable<Delayed>, do đó có nghĩa là bạn cần phải thực hiện compareTo(Object) (xóa bỏ hoàn của Comparable<Delayed>.compareTo()), nhưng bạn thực hiện compareTo(Delayed)

Hãy nhớ rằng:. loại thô có nghĩa là chỉ để tương thích ngược. Tránh chúng trong mã mới bằng mọi giá, họ làm những điều khó chịu!

Khi bạn thay đổi điều khoản extends của bạn để ScheduledFuture<Object> bạn "opt-in" vào hệ thống Generics và trình biên dịch cuối cùng nhận ra (ví dụ " được phép nhận ra ") rằngcủa bạnlà trong thực tế, việc thực hiện thích hợp của giao diện Comparable<Delayed>.

+1

+1: Điều này chắc chắn là do việc sử dụng các kiểu thô có nghĩa là tất cả các generics đều bị bỏ qua. –

+0

Tôi chỉ sử dụng các trình biên dịch Java HotSpot, 1.6.0_43 và 1.7.0_25. –

+0

@ThomasLarssonKron: "HotSpot" là JVM, nó không phải là trình biên dịch. Bạn có thể đã sử dụng 'javac' từ các phiên bản Java đó. –