interface A> { val symbol: ASymbol } interface B> : A { override val symbol: BSymbol } interface C : B { fun foo() override val symbol: CSymbol } interface ASymbol> { var value: T } interface BSymbol> : ASymbol interface CSymbol : BSymbol { fun bar() } fun test_1(symbol: BSymbol<*>) { if (symbol is CSymbol) { symbol.value.foo() } } fun test_2(b: B<*>) { if (b is C) { b.symbol.bar() } } fun > test_3(b: B) { if (b is C) { b.symbol.bar() } }