Не проверено приведение обобщенного предупреждения типа IDE класса - PullRequest
0 голосов
/ 30 апреля 2018

Для упрощения у меня есть два класса:

abstract class ClassA<T> where T : ClassA<T> {
    fun fooA(): T {
        //Do stuff
        return this as T //<-- Cast warning happens here
    }
}

open class ClassB : ClassA<ClassB>() {
    fun fooB(): ClassB {
        //Do stuff
        return this
    }
}

Эта строка, которую я отметил в функции fooA, помечается IntelliJ следующим предупреждением: "Unchecked cast: ClassA<T> to T". Если я что-то не упустил, то, как я настроил классы, должно сделать невозможным, чтобы возвращаемый тип в функции fooA не был потомком ClassA, то есть проверка приведения была бы избыточной. Или, по крайней мере, я не вижу способа, которым fooA может пытаться привести ClassA к чему-то, что не является его дочерним элементом. Я что-то упустил, или я в порядке, чтобы подавить предупреждение?

1 Ответ

0 голосов
/ 30 апреля 2018

Предупреждение верно. Потому что вы можете заполнить универсальный параметр злым аргументом, подобным этому:

class ClassC : ClassA<ClassB>()

Теперь вы можете создать ClassCastException, просто позвонив fooA на ClassC:

fun main(args: Array<String>) {
    val fooA = ClassC().fooA()
}

Вот почему fooA небезопасен.

Такого рода ошибки не могут быть обнаружены во время компиляции, и поэтому есть предупреждение.

Конечно, вы можете вручную убедиться, что ваш код не заполняет общий параметр неверным образом, и отключить предупреждение.

...