2016-12-23 17 views
-1

オペレータasを介してKotlinでどのように "継承を破る"ことができますか。それが実行しているとき、例えば enter image description here演算子asおよびClassCastException

は、私はそれが正しく

答えて

5

コンパイルする必要があります両方(Animal) -> Unit(Cat) -> Unitタイプが同じクラスFunction1<P1, R>で表現されていると同時に、ClassCastExceptionが得ることができます。実行時に同じであるため、1つを別のものにキャストすると、ClassCastExceptionになることはありません。

+0

申し訳ありませんが、私は別の問題を少し意味。実際には、私はコンパイルをしたいのですが、ClassCastExceptionを取得するために実行しているときは – Alex

+0

という意味です。実行時に 'ClassCastException'を得ることはできません。上記の – voddan

+0

を読んでください。私はこれを演算子で行いたいと思います。私の答えはClassCastExceptionを投げます。 – Alex

0

私はそのために安全でないキャストを使用しました(オペレータas)。 その良い例があります: java.lang.Integer cannot be cast to java.lang.Long in Kotlin (when the initial value is null)

package task 


open class Animal { 

} 

class Cat : Animal() { 

} 

fun main(args: Array<String>) { 
    var compare1: (Animal) -> Unit = {x: Animal -> println("Animal")} 
    var compare2: (Cat) -> Unit = {x: Cat -> println("Cat")} 
    var animal = Animal() 
    var cat = Cat() 
    compare1(animal) 
    compare2(cat) 
    val compare3 = compare2 as (Animal) -> Unit 
    //ClassCastException will be thrown 
    compare3(animal) 
} 
+0

'class'は' as '演算子が関数の型をチェックするのではなく、 'compare2'関数がbodyを実行する前にその' x'パラメータの実際の型をチェックするからです。 'Animal'と' Cat'を 'List 'と 'List 'に変更すると、このコードではもう例外は発生しません。 – Ilya

関連する問題