W następującym kodzie "Happy Halloween!"
, 42
itp. Są oznaczone jako "Niezgodność typów". (Wymagane: T, Found: String (lub Int)), ale czy kompilator nie powinien być w stanie wywnioskować, że zwracana wartość jest poprawnego typu z kontroli typu?Dlaczego pojawia się niezgodność typów podczas próby zwrócenia wartości dla sprawdzonego parametru ogólnego?
interface Type<T>
class StringType() : Type<String>
class IntType1() : Type<Int>
class IntType2(val a: Int, val b: Int) : Type<Int>
fun <T> something(type: Type<T>): T = when (type) {
is StringType -> "Happy Halloween!"
is IntType1 -> 42
is IntType2 -> type.a * type.a + type.b * type.b + type.a * type.b
else -> throw IllegalArgumentException()
}
Ustawiono typ zwrotu funkcji na 'T', ale zwracasz ciąg' Happy Halloween! '. Właśnie dlatego pojawia się niedopasowanie typu. – marstran
@marstran Typem zwracanym jest 'T', ale po' type jest StringType' return' true' Oczekuję, że kompilator będzie wiedział, że 'T' jest rzeczywiście' String'. – mfulton26
Ah, teraz widzę :) Nie jestem pewien, dlaczego to nie działa tak, jak ty to zrobiłeś, ale działa, jeśli zmienisz linię na 'jest StringType ->" Happy Halloween! " as T' – marstran