Компилятор недостаточно сложен, чтобы увидеть, что единственными возможными типами для K
являются String
и String?
(поскольку String
является окончательным), поэтому для компилятора K может быть другим подтипом String?
, поэтому приведение буквального String
может быть небезопасным. А поскольку K
- это общий тип c, приведение типов не проверяется из-за стирания типа.
Есть ряд ситуаций, подобных этой, которые возникают при работе с универсальными типами. Это не означает, что вы обязательно сделали что-то не так, просто компилятор не знает достаточно, чтобы быть уверенным, что это не так. Вы можете использовать @Suppress("UNCHECKED_CAST")
перед функцией или оператором, чтобы удалить предупреждение и подтвердить, что вы знаете, что это безопасное приведение. Это не значит, что вы делаете что-то взломанное или плохо спроектированное. Он используется несколько раз в исходном коде стандартной библиотеки.