亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

泛型未經檢查的轉換警告

泛型未經檢查的轉換警告

慕容森 2023-03-02 16:19:14
我不太明白,為什么我的代碼必須進行未經檢查的轉換以及如何解決這個問題。我正在使用構建器模式實現不可變對象,為此我使用內部接口“Builder”實現了“不可變”接口。每個不可變類都實現了 Immutable 接口,并實現了一個內部靜態類 Builder,后者實現了 Builder 接口。這一切都很好?,F在,我正在實現一堆非常簡單的類,實際上并不需要構建器,但我仍然想實現 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() 方法給出。
查看完整描述

1 回答

?
森欄

TA貢獻1810條經驗 獲得超5個贊

這非常簡單 - 的方法簽名期望為實際方法調用“即時”設置Immutable#builder類型參數,而不是綁定到類。T要適當地覆蓋此方法,簽名ConcreteClass將是


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

這顯然與您的構建器定義沖突


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

為了使這一切都可編譯,你必須從類而不是方法調用者中推斷出T,Immutable#builder即你終于有了


public interface Immutable<T> {


    public interface Builder<T> {

        public T build();

    }


    public Builder<T> builder(); 

}

并且所有繼承類都相應地更改以將 a 傳遞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);

    }

}


查看完整回答
反對 回復 2023-03-02
  • 1 回答
  • 0 關注
  • 159 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號