xem xét mã này Java:
package test;
public class Genric<E>
{
public Genric(E c){
System.out.println(c.getClass().getName());
}
public static void main(String[] args) {
new Genric<Integer[]>(new Integer[]{1,2});
}
}
Đối với trường hợp đầu tiên của bạn:
List< ? extends Integer[] > l;
Khi bạn làm điều gì đó như List< ? extends Integer[] > l;
này sau đó trình biên dịch Java thấy nó như là một List< ? extends Object> l;
và chuyển nó cho phù hợp . Vì vậy, đây là lý do tại sao bạn không nhận được bất kỳ lỗi nào.
Các tạo byte-code như sau:
.
.
.
20: aastore
21: invokespecial #52; //Method "<init>":(Ljava/lang/Object;)V
24: return
.
.
Thanh toán số dòng . Mặc dù, tôi đã vượt qua một mảng java.lang.Integer
; nội bộ nó được dịch sang java.lang.Object
.
Đối với trường hợp thứ hai của bạn:
class MyClass< T extends Integer[] > { } // ERROR!
Theo java ngôn ngữ đặc tả:
TypeParameter:
TypeVariable TypeBoundopt
TypeBound:
extends ClassOrInterfaceType AdditionalBoundListopt
.
.
Như bạn có thể thấy sự ràng buộc bao gồm duy nhất của lớp hoặc một giao diện (thậm chí không loại nguyên thủy). Vì vậy, khi bạn làm điều gì đó như thế này class MyClass< T extends Integer[] > { }
thì Integer[]
không đủ điều kiện làm lớp hoặc giao diện.
Theo sự hiểu biết của tôi về Java Spec, điều này đã được thực hiện để giải quyết tất cả các tình huống như
class MyClass< T extends Integer[] >
class MyClass< T extends Integer[][] >
- ..
class MyClass< T extends Integer[][]...[] >
Bởi vì tất cả chúng có thể được biểu diễn là java.lang.Object
và khi được chuyển làm thông số, như trong ví dụ
public Genric(E c){
System.out.println(c.getClass().getName());
}
khi 'c' nhớ loại thật của nó.
Hy vọng điều này sẽ hữu ích.
Thật lạ lùng. JLS khá rõ ràng nói rằng bạn chỉ có thể sử dụng các lớp hoặc giao diện trong các biến kiểu nhưng không đưa ra bất kỳ lời giải thích nào. – biziclop
chỉ để thực hiện các so sánh tương tự: "Danh sách Mở rộng số nguyên []> k1;" được cho phép, nhưng "Danh sách k2;" không phải là. Nhưng tôi không thể tìm thấy bất cứ điều gì ngoại trừ null để thêm vào danh sách! Eclipse cho biết k1.get (0) trả về kiểu Integer [], nhưng tôi không thể thêm một. –