2015-05-21 33 views
18

Điều này dường như biên dịch tốt với Java 7, và bất kỳ phiên bản của thư viện Scala:Tại sao điều này biên dịch theo Java 7 nhưng không theo Java 8?

public static void main(String[] args) { 
    scala.collection.immutable.Set<String> set = new scala.collection.immutable.HashSet<String>(); 
    Iterator<String> iterator = set.iterator(); 
} 

Nó cũng biên dịch tốt với Java 8 và Scala 2.11.5+. Nhưng với Java 8 và Scala 2.11.4, Eclipse than phiền:

The method iterator() is ambiguous for the type Set<String> 

Tôi không hiểu điều này. Bạn có thể nhận được sự mơ hồ mà qua đó phương pháp quá tải để chọn trong một số bối cảnh, nhưng chắc chắn không nếu bạn không đi qua bất kỳ đối số?

Điều thực sự kỳ lạ là nếu tôi viết lại nó như thế này:

public static void main(String[] args) { 
    Iterator<String> iterator = new scala.collection.immutable.HashSet<String>().iterator(); 
} 

thì khiếu nại sẽ biến mất. Điều này dường như với tôi chính xác tương đương với phiên bản trên. Vậy tại sao nó bây giờ biên dịch tốt?

+0

kiểm tra những gì đã thay đổi trong API của 'scala.collection.immutable.Set' trên Scala 2.11 .4 và 2.11.5? nếu đó là mã nguồn mở –

+1

@WvdL không có gì thay đổi. – mkrakhin

Trả lời

8

Nếu chúng ta so sánh sản lượng javap của scala.collection.immutable.Set, chúng tôi nhận được cho các 2.11.4:

public interface scala.collection.immutable.Set<A> 
    extends 
     scala.collection.immutable.Iterable<A>, 
     scala.collection.Set<A>, 
     scala.collection.generic.GenericSetTemplate<A, 
     scala.collection.immutable.Set>, 
     scala.collection.SetLike<A, scala.collection.immutable.Set<A>>, 
     scala.collection.Parallelizable<A, 
     scala.collection.parallel.immutable.ParSet<A>> { 
    public abstract scala.collection.generic.GenericCompanion<scala.collection.immutable.Set> companion(); 
    public abstract <B> scala.collection.immutable.Set<B> toSet(); 
    public abstract scala.collection.immutable.Set<A> seq(); 
    public abstract scala.collection.parallel.Combiner<A, scala.collection.parallel.immutable.ParSet<A>> parCombiner(); 
} 

và cho 2.11.5:

public interface scala.collection.immutable.Set<A> 
    extends 
     scala.collection.immutable.Iterable<A>, 
     scala.collection.Set<A> { 
    public abstract scala.collection.generic.GenericCompanion<scala.collection.immutable.Set> companion(); 
    public abstract <B> scala.collection.immutable.Set<B> toSet(); 
    public abstract scala.collection.immutable.Set<A> seq(); 
    public abstract scala.collection.parallel.Combiner<A, scala.collection.parallel.immutable.ParSet<A>> parCombiner(); 
} 

Phiên bản 2.11.4 không chính xác, nó vi phạm Đặc điểm máy ảo Java, section 4.7.9.1:

Chữ ký lớp mã hóa thông tin loại về khai báo lớp (có thể là chung chung). Nó mô tả bất kỳ tham số kiểu nào của lớp và liệt kê các tham số của nó là trực tiếp siêu lớp và trực tiếp siêu kết nối, nếu có. Một tham số kiểu được mô tả theo tên của nó, theo sau là bất kỳ ràng buộc lớp và ràng buộc giao diện nào.


này được giải thích rõ ràng trong this scalac issue, đã được cố định trong ... 2.11.5

+0

Điểm tốt! Tôi tự hỏi tại sao nó không xuất hiện trong Java 7? Có lẽ một cái gì đó để làm với việc triển khai thực hiện mặc định của các phương thức giao diện trong Java 8. Điều đó cung cấp cho một nguồn tiềm ẩn của sự mơ hồ mà phương thức cần được gọi. –

+1

Tôi chưa nghiên cứu tại sao nó hoạt động với java 7. biên dịch javac với mọi cấu hình (java [7,8] scala-libraries-2.11. [4,5]). Trình biên dịch Eclipse 8 eclipse ít bị cho phép. – gontard

5

Đây có thể không phải là vấn đề nghiêm ngặt về thư viện Java 8/Scala. Nó có thể liên quan đến Eclipse. Bạn đang sử dụng phiên bản Eclipse nào? Điều này nghe hơi giống như vấn đề này trong Eclipse 4.4: Java 8 generics thinks single method is ambiguous

+0

Tôi đang sử dụng 4.4.2. –

+0

Điều này cũng có thể liên quan. Tôi khá chắc chắn đó không phải là toàn bộ câu chuyện. Hôm qua, về cơ bản giống nhau nhưng trong một bối cảnh phức tạp hơn, IntelliJ đã biên soạn nó tốt nhưng Maven phàn nàn; hôm nay, cố gắng xây dựng một ví dụ tối thiểu, tôi thấy rằng Maven biên dịch nó tốt nhưng Eclipse phàn nàn. Weirder và weirder. –

+3

Nó không giải thích tại sao nó hoạt động với 2.11.5 – gontard

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