Получение ошибки «Несовместимые типы» при использовании кода, сгенерированного из класса данных Kotlin

Если я декомпилирую файл .class, сгенерированный с помощью data class State(val b: List<Array<Int>>) тогда я получаю следующий код Java:

 public final class State { private final List<? extends Integer[]> b; public State(List<? extends Integer[]> b) { this.b = b; } public final List<Integer[]> getB() { return this.b; } // ... } 

Если я копирую / вставляю этот java-код в свою IDE (Intellij 15), я получаю следующую ошибку компиляции метода getB() :

 Incompatible types. Required: List<Integer[]> Found: List<? extends Integer[]> 

Что мне здесь не хватает? Как код, сгенерированный Kotlin, может сделать это, но не мою копию / вставную версию?

В общем случае, когда javac загружает файл .class, он не выполняет полную проверку типа кода в этом классе; он будет доверять общим подписям, указанным в байт-коде. Из-за этого другие языки JVM могут генерировать сигнатуры, которые javac сам откажется генерировать.

В этом конкретном случае подстановочные знаки, созданные Kotlin beta 4, не имеют смысла ( Integer[] является окончательным классом, поэтому ? extends Integer[] бесполезен), поэтому текущая версия разработки не генерирует никаких подстановочных знаков в этом примере.

В общем, наша цель – обеспечить, чтобы API, написанные в Kotlin, были легко потреблять из Java-кода, и для этого Kotlin позволяет вам контролировать, где именно он генерирует подстановочные знаки. Это описано в разделе «Ярлыки Java».