2016-02-24 33 views
10

Nếu tôi cố gắng để truy cập JavaClass của một kiểu generic T trình biên dịch Kotlin phàn nàn rằng T không phải là một subtype của kotlin.AnyKotlin: Generics, phản ánh và sự khác biệt giữa các loại T và T: Bất kỳ

class Foo<T> (val t: T){ 
    val cls = t.javaClass // Error, T is not a subtype of kotlin.Any 
} 

Nếu định nghĩa T là một loại phụ của Mọi thứ đều hoạt động ok.

class Bar<T:Any> (val t: T){ 
    val cls = t.javaClass // OK 
} 

Q1) Nếu loại ´T´ không phải là loại phụ của 'Lớp học/lớp nào có thể là phân loại?

Q2) Thực hiện javaClass cho tất cả các phiên bản T và nếu có thì làm cách nào để truy cập?

Trả lời

11

Mặc định generic upper bound không phải là Any nhưng Any?.

Điều này cũng ngụ ý rằng không an toàn khi nhận được số javaClass từ đối số không thể thực hiện được.

Để có được một javaClass từ một loại dụ generic với Any? trên ràng buộc, bạn có thể bỏ nó vào Any:

val cls = (t as Any).javaClass //unsafe 
val clsOrNull = (t as? Any)?.javaClass //safe 
+1

Một điều mà puzzels tôi mặc dù là lý do tại sao tôi chỉ cần để cast cho các kiểu generic. Đối với một t 'var clsOfT = t? .javaClass' chung cho một lỗi biên dịch nhưng đối với một kiểu thường xuyên' var a: Any? = "A"; var clsOfA = a. .javaClass' này là ok mặc dù cả hai đều có upperbound ': Any?'? –

+1

@TomasKarlsson, +1, trông giống như một đặc thù của các thế hệ Kotlin. Tôi sẽ tìm câu trả lời. – hotkey

+0

Làm rõ phần trên: 't' là thuộc tính của kiểu generic' T' –

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