繁体   English   中英

带有泛型的未经检查的转换警告

[英]Unchecked conversion warning with generics

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

我正在使用构建器模式实现不可变对象,为此我使用内部接口“Builder”实现了“Immutable”接口。

每个不可变类都实现了 Immutable 接口,并实现了一个内部静态类 Builder,它实现了 Builder 接口。

所有这些工作正常。

现在,我正在实现一堆不需要构建器的非常简单的类,但我仍然想实现 Immutable 接口,所以这些类的对象是“Immutable”的实例,但我不想为每个类实现没有任何功能的空构建器。 我宁愿有一个抽象类,在其中为所有简单类实现一个简单的构建器。 builder只会存储原始对象并通过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,导致以下警告:

类型安全:来自 ConcreteClass 类型的 builder() 的返回类型 AbstractClass.AbstractBuilder 需要未经检查的转换以符合来自 Immutable 类型的 Immutable.Builder

编辑:警告是由 ConcreteClass 的 builder() 方法给出的。

这很简单 - Immutable#builder的方法签名期望类型参数T为实际方法调用“即时”设置,而不是绑定到类。 为了适当地覆盖此方法, ConcreteClass的签名将是

public <T> Builder<T> builder() {

这显然与您的构建器定义相冲突

return new AbstractClass.AbstractBuilder<ConcreteClass>(this);

为了使这一切都可编译,您必须从类而不是从方法调用者中推断出Immutable#builder T ,即您最终拥有

public interface Immutable<T> {

    public interface Builder<T> {
        public T build();
    }

    public Builder<T> builder(); 
}

并且所有继承类都相应地更改为将T传递给其前辈。

public interface Interface<T> extends Immutable<T> {

    public interface BuilderInterface<T> extends Immutable.Builder<T> {
    }
}


public abstract class AbstractClass<T> implements Interface<T> {

    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<ConcreteClass> {

    public ConcreteClass() {

    }

    @Override
    public Builder<ConcreteClass> builder() {
        return new AbstractClass.AbstractBuilder<ConcreteClass>(this);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM