Я реализую неизменяемый композит с использованием шаблона строителя и абстрактного базового класса как для элементов, так и для строителей. Чтобы уменьшить необходимость в кастинге и получить код для элементов как можно более краткими, я создаю базовые классы, используя дженерики. Я получаю одно предупреждение, которое я не понимаю. Пожалуйста, объясните, почему показано предупреждение и как я могу избавиться от него (без использования @SuppressWarnings («unchecked»))?Как избавиться от предупреждения типа «Тип безопасности» для универсального строителя?
Вот соответствующие части моего кода:
abstract public class JElement<J extends JElement<J>> {
abstract protected <B extends AbstractBuilder<J, B>> B newBuilder();
abstract public static class AbstractBuilder<J extends JElement<J>, B extends AbstractBuilder<J, B>> {
public AbstractBuilder() {
}
abstract public J build();
}
}
public class JClass extends JElement<JClass> {
JClass(Builder builder) {
}
@Override
protected Builder newBuilder() {
return new Builder(this);
}
public static class Builder extends JElement.AbstractBuilder<JClass, Builder> {
public Builder(JClass jClass) {
}
@Override
public JClass build() {
return new JClass(this);
}
}
}
Предупреждение находится в возвращаемом значении JClass.newBuilder:
Тип безопасности: Возвращение типа JClass.Builder для newBuilder () от типа JClass нуждается в непроверенной преобразование, чтобы они соответствовали B от типа JElement
Thenk you. Ваше предпочтительное решение (2) работает очень хорошо для меня. – Arne