2017-07-01 2 views
4

私は決してJavaのジェネリックスを理解していないので、コトリンの場合と思われます。私が正しくin修飾子のみによって消費されるTを示して理解していれば、コトルのコントラバナンス

Type mismatch. 
Required: kotlin.Comparator<in T> 
Found: AnyComparator 

class AnyComparator: Comparator<Any> { 
    override fun compare(o1: Any, o2: Any): Int { 
     TODO("not implemented") 
    } 
} 


fun <T> test() { 
    val x: Comparator<in Double> = AnyComparator() // OK! 
    val y: Comparator<in T> = AnyComparator() // Compilation error 
} 

二割当てがエラーで失敗します。(それは不自然な例です)次のコードスニペットを考えてみましょうジェネリック型Comparator(これは反則を作ります)ですので、には、の基本クラスであるタイプ引数Eを割り当てることができます。これに基づいて、タイプAnyはKotlinのすべてのクラスの基本クラスであるため、xyの両方の変数にAnyComparatorを割り当てることができます。私はできないことが判明し、私は理由を理解していません。

答えて

7

奇妙に見えるかもしれませんが、Anyは、すべてのkotlinクラスのスーパークラスではなく、null許容クラスではありません。すべてのKotlinクラスの実際のスーパークラスはAny?(それはAnyのスーパークラスでもあります)です。

testファンクションの汎用タイプTには上限がないため、null可能なオブジェクトAny?にすることができます。このエラーは、Comparator<Any?>が必要なときにComparator<Any>を送信できないためです。

だから、上位AnyとしてバインドTを定義するあなたの例を修正することができます:

fun <T: Any> test() { 
    //... 
} 
+1

おかげで、それは確かに役立ちます。あなたのヒントに基づいて、別の修正はAnyComparatorによって 'Comparator 'の代わりに 'Comparator 'を実装しています。 – Katona

+0

'Any'は実際にすべてのkotlinクラスのスーパークラスですが、すべてのkotlin型のスーパータイプではありません。 'KType'は' isMarkedNullable'プロパティを持ち、 'KClass'はクラスだけであり、クラスはnullを認識できません。提案: 's/class/type/g'。例えば'kotlin.Any?'は 'kotlin.Any'のスーパータイプですが、それぞれのクラスの分類子は' class kotlin.Any'です。 – mfulton26

関連する問題