Вы можете контролировать, как Java видит дженерики Котлин с помощью JvmWildcard
и JvmSuppressWildcards
аннотацию. Он был добавлен в Kotlin 1.0 Beta 4 (см. announcement).
Это изменение означает, что ваш код будет уже изменен, чтобы быть в порядке, и больше не генерирует шаблон. Поскольку новый параметр по умолчанию не использует их во многих случаях, и вы можете вернуть их с помощью аннотаций или подавить их, когда это нежелательно.
Анонс этого изменения состояния:
Java Wildcards
Были проблемы с тем, как Котлин переведенный типы вариант, например, должен ли List быть List на Java или просто List. Тонкости детали в сторону, мы сделали следующее:
- По умолчанию, мы не генерируют символы в возвращаемых типов и где они не имеют никакого смысла
- Когда подстановочные требуется, можно применять свое присутствие аннотации типа : Список < @JvmWildcard String> всегда перечисляют в Java
- Когда нам нужно избавиться от маски, мы можем использовать @JvmSuppressWildcards (это могут быть использованы на типе или любого заявления, содержащего его)
Примеры:
fun foo(l: List<String>) // in Java: List<String> (String is final)
fun foo(l: List<@JvmWildcard String>) // in Java: List<? extends String>
interface Open {}
fun bar(p: List<Open>) // in Java: List<? extends Open> (Open is not final)
@JvmSuppressWildcards
fun bar(p: List<Open>) // in Java: List<Open>
Так применяя это на ваш вопрос, если вы по-прежнему возникают проблемы:
@JvmSuppressWildcards
public fun getObservable(): Observable<List<FooBar>> {
return Observable.just(theList)
}
Путь вокруг этого использовать 'MutableList', однако это не помогает, если' GetList() 'запрашивать неизменяемый тип возвращаемого значения. –
Не можете ли вы просто нарисовать на Java? –
Да, это возможно, однако я бы предпочел не помешать каждому экземпляру этой ситуации бросать. Кроме того, вопрос заключается скорее в любопытстве к языковым преимуществам Котлина для этой ситуации. –