Как добавить содержимое одной коллекции в новую коллекцию

Я пытаюсь переопределить метод, который вызывает суперкласс и добавляет возвращаемые значения в новую коллекцию (это необходимо, потому что возвращаемое значение суперкласса является неизменным).

Идиоматическая Java для этого заключается в следующем:

public class JaxrsApplication extends Application { @Override public Set<Class<?>> getClasses() { HashSet<Class<?>> classes = new HashSet<>(super.getClasses()); classes.add(PlainTextWriter.class); classes.add(PageResource.class); return classes; } } 

Я пытаюсь реализовать эквивалент в Kotlin без успеха:

 public class JaxrsApplication() : Application() { override fun getClasses(): MutableSet<Class<out Any?>>? { val classes = hashSetOf<Class<out Any?>>() classes.addAll(super.getClasses()) // <= compiler error! classes.add(javaClass<PlainTextWriter>()) classes.add(javaClass<PageResource>()) return classes } } 

Кажется, это проблема вывода типа в функции addAll, но я не уверен, как ее разрешить. Помогите оценить 🙂


Для будущих читателей причина, по которой я был запутан здесь, объясняется несоответствием типов в всплывающем окне ошибки:

всплывающее окно ошибки

MutableSet реализует Iterable , ключ здесь – окончательный '?' символ в строке «Найдено», указывающий, что возвращаемое значение равно NULL.

Вы получаете ошибку компилятора, потому что super.getClasses возвращает тип с super.getClasses nullable , но addAll принимает только addAll аргумент.

Это можно решить с помощью if-statement или !! оператор:

1.

 val superClasses = super.getClasses() if (superClasses != null) { classes.addAll(superClasses) } 

2.

 classes.addAll(super.getClasses()!!) 

В Kotlin M9 вы больше не должны этого задавать. Он имеет концепцию систем различного типа или «типы платформ» с типами платформы Java и JavaScript, которые различаются и более слабыми, чем типы Kotlin. Поэтому вы можете использовать возможно нулевой тип платформы Java в том месте, где вам не будет разрешен более конкретный тип Kotlin. Например, метод Java возвращает возможное значение null, тогда предполагаемый тип будет типом платформы Java, и вы можете передать его другим вещам, где нулевая проверка отключена, поскольку она неизвестна для Java. Если вы конкретно укажете тип Kotlin без использования вывода типа, то вы будете принуждать его к более строгой проверке нуля, и в этой строке кода Kotlin будет утверждать, что это значение не является нулевым для вас (так же, как и раньше) !! ,

Итак, в M9 у вас есть два варианта. Пусть типы Java теряются и вызывают возможные проблемы. Или скажите Kotlin, что вы хотите относиться к нему конкретно как nullable или не null, или использовать старый! утверждать.