2015-02-01 5 views
1

Вы можете унаследовать тип A от типа B, но всякий раз, когда вы определяете тип A, вы получите тип A? (nullable on) бесплатно. Но где он лежит именно в иерархии типов? A? наследует от A или наоборот?Каково место в иерархии типов типов с нулевым значением?

Я спрашиваю это потому, что я озадачен с таким кодом:

open class Foo { 
    fun foo() : Int { 
    return 0; 
    } 
} 

fun test<T : Foo?>(x:T) : Int { 
    return x.foo() // (@) 
} 

fun main(args: Array<String>) { 
    println(test<Foo?>(null)) 
} 

Я не понимаю, почему линия (@) компилируется? Или, другими словами, я не понимаю иерархию типов с нулевыми типами, потому что до сих пор я имел T как Foo? или любой тип, полученный из него. Можете ли вы вывести тип с нулевым значением с нулевым значением и что это будет означать?

Извините, если это что-то очевидное, я просто изучаю Котлин.

(@) для типов с нулевым значением оно должно быть x!!.foo().

ответ

2

Это ошибка в компиляторе. Вы не сможете позвонить члену T, когда T имеет обнуляемую верхнюю границу. X? - это супертип X.