Он говорит (z: X)X потому, что это сигнатура метода safeCast с выведенными аргументами.
Причем здесь сигнатура? Когда компилятор не находит мембера, он ищет имплисит конвершн, преобразующий ресивер в нечто, что содержит нужный мембер. Как вот тут: implicit value for L.this.x.type => ?{val *: ?}.
Так как у Y нет мембера * (в силу того, что тот экзистенциальный тип, как мы выяснили, не влияет на тайп инференс), то соответственно safeCast не соответствует нужной сигнатуре.
no subject
Причем здесь сигнатура? Когда компилятор не находит мембера, он ищет имплисит конвершн, преобразующий ресивер в нечто, что содержит нужный мембер. Как вот тут: implicit value for L.this.x.type => ?{val *: ?}.
Так как у Y нет мембера * (в силу того, что тот экзистенциальный тип, как мы выяснили, не влияет на тайп инференс), то соответственно safeCast не соответствует нужной сигнатуре.