泛型未经检查的转换警告

我不太明白,为什么我的代码必须进行未经检查的转换以及如何解决这个问题。


我正在使用构建器模式实现不可变对象,为此我使用内部接口“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() 方法给出。


慕容森
浏览 131回答 1
1回答

森栏

这非常简单 - 的方法签名期望为实际方法调用“即时”设置Immutable#builder类型参数,而不是绑定到类。T要适当地覆盖此方法,签名ConcreteClass将是public <T> Builder<T> builder() {这显然与您的构建器定义冲突return new AbstractClass.AbstractBuilder<ConcreteClass>(this);为了使这一切都可编译,你必须从类而不是方法调用者中推断出T,Immutable#builder即你终于有了public interface Immutable<T> {&nbsp; &nbsp; public interface Builder<T> {&nbsp; &nbsp; &nbsp; &nbsp; public T build();&nbsp; &nbsp; }&nbsp; &nbsp; public Builder<T> builder();&nbsp;}并且所有继承类都相应地更改以将 a 传递T给它的前辈。public interface Interface<T> extends Immutable<T> {&nbsp; &nbsp; public interface BuilderInterface<T> extends Immutable.Builder<T> {&nbsp; &nbsp; }}public abstract class AbstractClass<T> implements Interface<T> {&nbsp; &nbsp; public static class AbstractBuilder<T> implements Interface.BuilderInterface<T> {&nbsp; &nbsp; &nbsp; &nbsp; private final T object;&nbsp; &nbsp; &nbsp; &nbsp; public AbstractBuilder(T object) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.object = object;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; public T build() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return this.object;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; protected AbstractClass() {&nbsp; &nbsp; &nbsp; &nbsp; super();&nbsp; &nbsp; }}public class ConcreteClass extends AbstractClass<ConcreteClass> {&nbsp; &nbsp; public ConcreteClass() {&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; public Builder<ConcreteClass> builder() {&nbsp; &nbsp; &nbsp; &nbsp; return new AbstractClass.AbstractBuilder<ConcreteClass>(this);&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java