2016-02-24 7 views
10

私はKotlinコンパイラはTがkotlin.AnyKotlin:ジェネリック、反射およびタイプTとTとの違い:任意

class Foo<T> (val t: T){ 
    val cls = t.javaClass // Error, T is not a subtype of kotlin.Any 
} 
のサブタイプではないと文句を言い、ジェネリック型TののJavaClassにアクセスしようとした場合

Tをサブタイプとして定義する場合は、すべてが正常に動作します。

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

Q1)型'T'は、クラス/クラス、それはのサブタイプであることができ'Any'のサブタイプでない場合には?

Q2)Tのすべてのインスタンスに対してjavaClassが存在するかどうか、もしあればそれにアクセスするにはどうすればよいですか?

答えて

11

デフォルトのgeneric upper boundは、Anyではなく、Any?です。

これは、ヌル可能な引数からjavaClassを取得することがnullでも安全でないことを意味します。

上限Any?でジェネリック型のインスタンスからjavaClassを取得するには、あなたがAnyにキャストすることができます:私は、一般的なタイプのためにキャストする必要がある理由しかし、私をpuzzels

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

一つのことです。一般的な 'var clsOfT = t?.javaClass'の場合、これはコンパイルエラーですが、通常の型' var a:Any? = "A"; var clsOfA = a?.javaClass'これはどちらも上向きの ':Any?'を持っていてもOKです。 –

+1

@TomasKarlsson、+1は、Kotlinジェネリックの特異性のようです。私は答えを見つけるつもりです。 – hotkey

+0

上記への明確化: 't'はジェネリック型' T'のプロパティです。 –

関連する問題