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

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

在Java中使用父類名存儲時如何返回繼承的對象

在Java中使用父類名存儲時如何返回繼承的對象

溫溫醬 2023-08-16 17:47:37
我正在嘗試創建一個助手。我的應用程序可以有許多庫,一旦實例化,我想創建一個工廠以便能夠跨類共享實例,即:public ArrayList<Helper> helper = new ArrayList<>(asList(    new Helper(SomeLib.class, new SomeLib()),    new Helper(SomeOtherLib.class, new SomeOtherLib())));我的圖書館課程目前是測試這項工作的標準。class Library {    public Library() { System.out.println("Instance is working"); }}我試圖開始工作的示例庫如下所示:public class ExampleLib extends Library {    public void test() { System.out.println("Test OK"); }}我當前的 Helper 類看起來像這樣,但是,我無法將庫強制轉換回原來的繼承類,我嘗試了多種方法:import dreambot.libs.Library;public class Helper {    private Library lib;    private Class<? extends Library> name;        public Helper(Class<? extends Library> name, Library lib) {        this.name = name;        this.lib = lib;    }        public Class<? extends Library> getName() { return name; }    public <Library> Library getLib() {        // All the things I've tried to do        return (this.name) lib;        return name.cast(lib);        return lib.getClass().cast(lib);    }}反過來,我想要的是:public ArrayList<Helper> helper = new ArrayList<>(asList(    new Helper(ExampleLib.class, new ExampleLib()),));public void test() {    Arrays.stream(helper.toArray()).filter(c -> c.getName(ExampleLib.class)).getFirst().ifPresent(h -> {        h.getLib().test(); // Should output "Test OK"    });我在 IDE 中收到的錯誤Helper::getLib是:不是一個聲明return (this.name) lib;需要不兼容的類型:庫,找到:dreambot.libs.Library for return lib.getClass().cast(lib);和return name.cast(lib);任何幫助,將不勝感激。
查看完整描述

1 回答

?
墨色風雨

TA貢獻1853條經驗 獲得超6個贊

嘗試:


import dreambot.libs.Library;


public class Helper<T extends Library> {

    private T lib;

    private Class<T> name;


    public Helper(Class<T> name, Library lib) {

        this.name = name;

        this.lib = lib;

    }


    public Class<T> getName() { return name; }

    public T getLib() {

        return lib;

    }

}

甚至更簡單:


import dreambot.libs.Library;


public class Helper<T extends Library> {

    private T lib;


    public Helper(Library lib) {

        this.lib = lib;

    }


    public Class<T> getName() { return lib.getClass(); }

    public T getLib() {

        return lib;

    }

}

并且在調用構造函數時不要忘記鉆石運算符:


public ArrayList<Helper> helper = new ArrayList<>(asList(

    new Helper<>(SomeLib.class, new SomeLib()),

    new Helper<>(SomeOtherLib.class, new SomeOtherLib())

));

可以簡化為:


public ArrayList<Helper> helper = new ArrayList<>(asList(

    new Helper<>(new SomeLib()),

    new Helper<>(new SomeOtherLib())

));


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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