我不太明白,为什么我的代码必须进行未经检查的转换以及如何解决这个问题。
我正在使用构建器模式实现不可变对象,为此我使用内部接口“Builder”实现了“不可变”接口。
每个不可变类都实现了 Immutable 接口,并实现了一个内部静态类 Builder,后者实现了 Builder 接口。
这一切都很好。
现在,我正在实现一堆非常简单的类,实际上并不需要构建器,但我仍然想实现 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);
}
}
我期望 Immutable 接口的泛型类型 T 采用实现类的类型,但它似乎是 Object,这会导致以下警告:
AbstractClass.AbstractBuilder<ConcreteClass>类型安全:来自 ConcreteClass 类型的 builder() 的返回类型需要未经检查的转换以符合Immutable.Builder<Object>Immutable 类型
编辑:警告由 ConcreteClass 的 builder() 方法给出。
森栏
相关分类