Я не совсем понимаю, почему мой код должен делать непроверенное преобразование и как я могу это исправить.
Я реализую неизменяемые объекты с помощью шаблона построителя, для которого я реализовал интерфейс «Неизменяемый» с внутренним интерфейсом «Построитель».
Каждый неизменяемый класс реализует интерфейс Immutable и реализует внутренний статический класс Builder, который реализует интерфейс Builder.
Все это работает нормально.
Теперь я реализую кучу очень простых классов, которым на самом деле не нужен конструктор, но я все еще хочу реализовать интерфейс Immutable, поэтому объекты этих классов являются экземплярами «Immutable», но я не хочу реализовать пустые конструкторы без какой-либо функциональности для каждого класса. Я бы предпочел иметь абстрактный класс, в котором можно реализовать один простой конструктор для всех простых классов. Построитель просто сохранит исходный объект и вернет его через метод build(), поэтому интерфейс Immutable реализован полностью.
Однако метод build() построителя должен возвращать объект реализующего класса. Поэтому я добавил дженерики.
public interface Immutable {
public interface Builder<T> {
public T build();
}
public <T> Builder<T> builder();
}
public interface Interface extends Immutable {
public interface BuilderInterface<T> extends Immutable.Builder<T> {
}
}
public abstract class AbstractClass implements Interface {
public static class AbstractBuilder<T> implements Interface.BuilderInterface<T> {
private final T object;
public AbstractBuilder(T object) {
this.object = object;
}
@Override
public T build() {
return this.object;
}
}
protected AbstractClass() {
super();
}
}
public class ConcreteClass extends AbstractClass {
public ConcreteClass() {
}
@Override
public AbstractBuilder<ConcreteClass> builder() {
return new AbstractClass.AbstractBuilder<ConcreteClass>(this);
}
}
Я ожидал, что универсальный тип T интерфейса Immutable примет тип реализующего класса, но вместо этого он выглядит как Object, что приводит к следующему предупреждению:
Безопасность типов: возвращаемый тип AbstractClass.AbstractBuilder для builder() из типа ConcreteClass требует непроверенного преобразования, чтобы соответствовать Immutable.Builder из типа Immutable.
EDIT: предупреждение выдается методом builder() класса ConcreteClass.