У меня есть (еще один) непроверенный вопрос.Я на 90% уверен, что это безопасно, но я хочу убедиться (я оправдываю использование @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<Bird<C>>
, потому что bird
, который передается в параметр, гарантированнобыть Bird<C>
.
Тестирование подтверждает мою теорию, но я хочу убедиться, что мое мышление верно. Есть ли способ, которым этот код небезопасен?
Обновление
Спасибо за ваши ответы.Из-за ответов я понял, что в моей структуре была слабость, и пересмотрел ее.
По существу Cat
использует простой Writer
, который знает, что всегда пишет Cat
.В моем случае, у меня есть тип «SmartAnimal», который может быть записан динамическим Writer, так что мне не нужно создавать Writer
для каждого животного.
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());
}
}
СноваУ меня такое же предупреждение, но это кажется более безопасным.
Это лучше и безопаснее?