2013-09-25 29 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; 
    } 
} 

Mã trên biên dịch trong java 5 nhưng không phải trong java 7 tại sao? Trong java 7 nó cho "Tên xung đột: Phương thức chuyển đổi (Bộ sưu tập) loại StaticMethodChild có cùng xóa như Bộ sưu tập (loại) của loại StaticMethodDemo nhưng không ẩn nó"Lỗi Clash biên dịch tên khi biên dịch trong java 7 nhưng hoạt động tốt trong java 5

Trả lời

2

Java không cho phép ghi đè các phương thức tĩnh. Xem Why doesn't Java allow overriding of static methods?

Điều duy nhất bạn có thể làm là ẩn một phương thức tĩnh trong phân lớp. Ẩn có nghĩa là nó không phụ thuộc vào loại đối tượng mà nó được gọi, nhưng trên loại lớp nào. Xem http://docs.oracle.com/javase/tutorial/java/IandI/override.html

Bây giờ vấn đề là, phương thức lớp con của bạn có cùng một chữ ký chính thức nhưng vì các kiểu chung nó không ẩn nó. Collection<? extends ArithmeticExpression> không giống nhau hay kiểu phụ của Collection<? extends Expression> thực tế ngăn chặn việc ẩn đúng, không rõ ràng. Như Ayobi đã chỉ ra, quy tắc trình biên dịch đã được giới thiệu để đảm bảo khả năng tương thích ngược: Method has the same erasure as another method in type

Không thể thử nó ngay bây giờ nhưng lỗi sẽ biến mất khi cả hai đều có cùng loại chung. Mặc dù tôi không có ý tưởng tại sao lỗi không xảy ra trong Java 5. Tôi đoán họ đã giới thiệu quy tắc trình biên dịch trong một phiên bản sau bởi vì họ không nhận thấy nó trước đây.

+0

Cảm ơn bạn đã giải thích. Hiện tại tôi đang làm việc trên một dự án mà chúng tôi đang chuyển sang Java 7 và số lượng lớn các lớp có vấn đề này. Ngoài việc này tôi cũng phải đối mặt với vấn đề với các phương pháp có vargs. – Dragon

+0

Bạn chắc chắn nên cấu trúc lại tất cả các lớp đó vì đây là một nguồn lỗi. –

4

Bên cạnh câu trả lời của stonedsquirrel, ngay cả khi phương pháp không tĩnh, bạn cũng sẽ gặp lỗi tương tự.

Điều này là do Loại xóa, bạn sẽ cố gắng ghi đè chuyển đổi bằng loại không tương thích.

Kiểm tra sau answer để có giải thích tốt đẹp.

+0

Câu trả lời được liên kết khác không phải là lỗi tương tự như OP, câu trả lời khác không nói về loại tẩy xoá tốt, nhưng nó không đề cập đến các phương pháp tĩnh và bit chính của lỗi "nhưng không ẩn nó" –

Các vấn đề liên quan