У меня есть (еще один) непроверенный вопрос о приведении . Я на 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());
}
}
Опять же, я есть такое же предупреждение, но это кажется более безопасным.
Так лучше, и насколько это безопасно?