Java Generics - безопасно ли это непроверенное приведение?

У меня есть (еще один) непроверенный вопрос о приведении . Я на 90% уверен, что это безопасно, но хочу убедиться (я m, оправдывая использование @SupressWarnings другому разработчику, который проверяет код)

Наш фреймворк создал следующий шаблон:

abstract class Writer<T> {
    Class<T> valueType;

    Writer(Class<T> valueType) {
        this.valueType = valueType;
    }
}
class Cat { }

class CatWriter extends Writer<Cat> {
    CatWriter() {
        super(Cat.class);
    }
}

Я также использую подкласс Writer для написания класса, использующего обобщенные типы:

class Color {}
class Green extends Color {}
class Brown extends Color {}

Мой класс писателя выглядит так:

abstract class Bird<C extends Color> {}
class Parrot extends Bird<Green>{}
class Ostrich extends Bird<Brown>{}

class BirdWriter<C extends Color> extends Writer<Bird<C>> {
    BirdWriter(Bird<C> bird) {
        super((Class<Bird<C>>)bird.getClass());
    }
}

Я мог бы использовать необработанные типы в писателе, но это дает гораздо больше предупреждений. Вместо этого я включаю универсальные шаблоны в класс Writer. Это нормально везде, кроме конструктора. Я вынужден преобразовать bird.getClass () (который является объектом класса, не имеющим общей сигнатуры) в объект Class с общей сигнатурой. Это дает неконтролируемое приведение предупреждение о приведении, , но я считаю, что можно безопасно привести результат к Class > , потому что птица , которая передается в параметр, гарантированно будет Bird .

Тестирование подтверждает мою теорию, но я хочу убедиться, что мое мышление правильное. Есть ли способ, которым этот код небезопасен?


Обновление

Спасибо за ваши ответы. Благодаря ответам я понял, что в моей структуре есть слабая сторона, и исправил ее.

По сути Cat использует простой Writer , который знает, что всегда пишет Cat . В моем случае у меня есть тип «SmartAnimal», который может быть написан динамическим Writer, так что мне не нужно создавать Writer для каждого Animal.

class SmartAnimal {}
class Dog extends SmartAnimal {}
class Horse extends SmartAnimal {}
class SuperHorse extends Horse {}

class DynamicWriter<A extends SmartAnimal> extends Writer<A> {
    DynamicWriter(A smartAnimal) {
        super((Class<A>)smartAnimal.getClass());
    }
}

Опять же, я есть такое же предупреждение, но это кажется более безопасным.

Так лучше, и насколько это безопасно?

5
задан Nicole 27 January 2011 в 00:39
поделиться