2016-03-10 17 views
8

Trong cuốn sách này, nó nói:Hạn chế của Arrays.asList() là không đúng sự thật trong tư duy trong Java 4th Edition

Một hạn chế của Arrays.asList() là phải mất một đoán tốt nhất về loại kết quả của Danh sách và không chú ý đến những gì bạn đang gán cho nó.

Cuốn sách này là Tư duy trong Java By Bruce Eckel

Tuy nhiên, đoạn mã sau đang làm việc tốt, trái với mã hiển thị trong trang sách này 280

public class Main{ 

    public static void main(String[] args) { 
     List<Snow> snow = Arrays.asList(new Light(), new Heavy()); 
    } 
} 
class Snow {} 
class Powder extends Snow {} 
class Light extends Powder {} 
class Heavy extends Powder {} 

Java 1.8, IntelliJ , Windows 7 enter image description here

Mọi ý tưởng đều được đánh giá cao.

+0

Bột, ánh sáng, hạng nặng có được thuộc tính của lớp Snow sau đó rõ ràng là hoạt động tốt – Ajinkya

+2

Hai điều: đầu tiên, bạn đang lấy lại thứ gì đó ít nhất là phù hợp với giao diện 'List', vì vậy không có vấn đề ở đó, và thứ hai , bạn sẽ phải làm gì? Không có gì ở đây ngay lập tức nhảy ra rằng điều này rõ ràng là ồ ạt sai ... – Makoto

+0

@Makoto Rất tiếc, tôi đã cập nhật câu hỏi. –

Trả lời

8

Mã này không thành công trong Java-7, nhưng biên dịch trong Java-8. Sử dụng javac 7u80 Tôi thấy:

Main.java:7: error: incompatible types 
       List<Snow> snow = Arrays.asList(new Light(), new Heavy()); 
              ^
    required: List<Snow> 
    found: List<Powder> 
1 error 

Suy luận kiểu trong Java-8 được cải thiện đáng kể. Trước đó, loại được phỏng đoán cho mỗi biểu thức phụ riêng biệt dựa trên phân tích biểu thức phụ đó, do đó, loại Arrays.asList(new Light(), new Heavy()) được yêu cầu được biết bất kể bối cảnh xung quanh. Trong Java-8 ngữ cảnh xung quanh có thể giải thích cho loại biểu thức.

Trong phiên bản đặc tả ngôn ngữ Java phiên bản 8 có whole new chapter dành riêng cho suy luận loại. Nó không phải là rất dễ dàng để đọc, nhưng để hiểu biết của tôi bây giờ thay vì chỉ định các loại cụ thể cho mỗi subexpression một tập hợp các constraints được chỉ định. Trong trường hợp của chúng tôi, các ràng buộc là Light <: T && Heavy <: T (không có loại chính xác nào được suy ra ở đây). Tiếp theo quá trình giảm được thực hiện làm giảm tập hợp các ràng buộc đối với tập hợp các giới hạn có tính đến expression compatibility constraints.

+0

appriciate nhưng bạn xin vui lòng giải thích một chút sâu hơn về bối cảnh surronding và loại biểu hiện. ?? –

+0

@VikrantKashyap Tôi đã thêm một số giải thích, nhưng để hiểu điều này đầy đủ chi tiết, bạn phải đọc đặc điểm kỹ thuật. –

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