Я читал раздел о ключевых словах "in and out" в Kotlin из книги "Kotlin Программирование - Руководство ранчо для больших ботаников". Я пришел из C ++ фона, где инициализация и присваивание являются двумя очень разными понятиями. Следующий фрагмент кода из книги (слегка измененный) вводит меня в заблуждение.
Код выглядит следующим образом:
class Barrel<out T>(val item:T)
open class Loot(val value: Int)
class Fedora(val name:String, value:Int) : Loot(value)
public fun main(){
var fedoraBarrel: Barrel<Fedora> = Barrel(Fedora("a generic-looking fedora", 15))
var lootBarrel: Barrel<Loot> = fedoraBarrel
lootBarrel = fedoraBarrel
val myFedora: Fedora = lootBarrel.item
}
Здесь, когда я комментирую строку
lootBarrel = fedoraBarrel
В следующей строке я получаю следующую ошибку, когда пытаюсь получить элемент Fedora из бочки, и ошибка:
Error:(27, 28) Kotlin: Type mismatch: inferred type is Loot but Fedora was expected
Чем назначение fedoraBarrel для lootBarrel отличается от инициализации lootBarrel с помощью Федора Баррель. Зачем мне нужна строка
lootBarrel = fedoraBarrel
для этого кода для компиляции?