2015-03-26 12 views
5

Trong bối cảnh Generics java, một loại nguyên là một invocation không tham số của một loại chung chung. Họ cũng nói rằng bất kỳ loại không chung chung nào không phải là loại thô.Java Generics - Làm thế nào là một loại nguyên liệu khác nhau từ một loại không chung chung

Sự nhầm lẫn của tôi là, tại sao họ cho rằng loại không phải loại chung không phải là loại thô? Nó khác với lời gọi không tham số của một kiểu generic. Hãy xem xét 2 trường hợp sau đây.

Trường hợp 1:

class A<T>{ 

} 
A a = new A(); //Raw type 

Trường hợp 2:

class A{ 

} 
A a = new A();//Non-generic type 

Nếu biến "a" cư xử hệt trong cả hai trường hợp, tại sao họ nói trường hợp [1] là kiểu thô trong khi trường hợp [2 ] không phải là?

+0

Hành vi về cơ bản giống nhau. Về mặt ngữ nghĩa nó khá khác biệt. –

+0

Bạn có thể đọc http://stackoverflow.com/questions/2770321/what-is-a-raw-type-and-why-shouldnt-we-use-it –

+0

@Ortomala Lokni cảm ơn vì liên kết đó. Nó nói rằng "Về cơ bản, các kiểu thô hoạt động giống như trước khi các generics được giới thiệu" có thể nói với tôi rằng biến "a" của tôi sẽ hoạt động giống hệt nhau trong cả hai trường hợp. Nếu điều đó đúng, vui lòng trả lời câu hỏi này. Tôi sẽ chấp nhận nó. Nhưng tôi vẫn tự hỏi trong trường hợp đó tại sao họ nói rằng một cái không chung chung KHÔNG PHẢI LÀ LOẠI HÌNH? Có gì sai khi nói rằng tất cả các loại không phải loại chung cũng là LOẠI RAW? –

Trả lời

4

Khái niệm loại thô chỉ liên quan đến loại chung do vấn đề loại thô được coi là tương thích gán với loại chung, nhưng thực hiện nhiệm vụ đó sẽ mở lỗ hổng trong loại an toàn nếu không được bảo đảm cho chung kiểu. Ví dụ: hãy xem xét phương thức void workWith(A<Integer> a). Bạn sẽ được phép vượt qua biến số a của mình, dẫn đến sự cố về an toàn loại.

Vì không phải loại chung chung không thể bị các vấn đề như vậy, chúng không được gọi là "loại thô".

+0

@ SureshKumarKV: Vâng, việc sử dụng các kiểu thô sẽ cho bạn một cảnh báo, trong khi sử dụng các loại không chung chung thì không. – newacct

1

Như đã nói trong JLS:

A non-generic class or interface type is not a raw type.

Bạn có thể cảm thấy sự khác biệt trong cú phápmức:

nếu chúng ta có lớp tham số:

class A<X> { 
    class B<Y> { 
     Y y; 
    } 
} 

sau đó chỉ cần A tên loại hoặc tên B loại không non-generic loại, họ raw loại, và những ảnh hưởng này về cách bạn có thể truy cập vào chúng:

tất cả các công trình xây dựng này sẽ gây ra lỗi biên dịch thời gian:

A<Integer>.B ab = null; 
A.B<Integer> ab = null; 
+0

Tôi đồng ý. Tôi quan tâm hơn để biết nếu biến "a" hoạt động khác nhau trong 2 trường hợp tôi đã đưa ra. –

0

loại thô đã làm với các giới hạn các loại chung và loại tẩy xoá. Nếu bạn có ArrayList<? extends Shape> thì loại giới hạn là Hình dạng và sẽ là loại thô tại thời gian biên dịch.

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