第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

如何在泛型類中正確鍵入 no-arg 和 withVar 構(gòu)造函數(shù)?

如何在泛型類中正確鍵入 no-arg 和 withVar 構(gòu)造函數(shù)?

搖曳的薔薇 2023-06-04 19:47:47
我正在研究一個(Java 8+)類,我想使用一種“構(gòu)建器”模式構(gòu)建它,在該模式中,您將無參數(shù)構(gòu)造函數(shù)鏈接到一個或多個返回相同對象的設(shè)置器?;旧线@是我的課:public class MyClass {  private int foo;  private String bar;  public MyClass() {    System.out.println("initializing instance of MyClass");  }  public MyClass withFoo(int foo) {    this.foo=foo;    return this;  }  public MyClass withBar(String bar) {    this.bar = bar;    return this;  }}您初始化它的典型方法是MyClass anInstance = new Myclass().withFoo(42).withBar("helloworld");這是一個很好的模式,但我以前從未將它用于泛型類?,F(xiàn)在我想泛化我的班級。我對類簽名和構(gòu)造函數(shù)、withFoo 和 withBar 方法進(jìn)行了更改:public class MyClass<T> {  private int foo;  private String bar;  public MyClass() {    System.out.println("initializing instance of MyClass");  }  public MyClass<T> withFoo(int foo) {    this.foo=foo;    return this;  }  public MyClass<T> withBar(String bar) {    this.bar = bar;    return this;  }}請注意,foo它們bar自己不會改變類型。任何類型<T>都不會通過方法傳入withVar()。我有一些線索表明這不是最好的方法。標(biāo)準(zhǔn)的無參數(shù)構(gòu)造函數(shù)似乎工作正常:工作正常: MyClass<Float> myInstance = new MyClass<>();但是,如果我添加一個withVar函數(shù),我會在編譯時遇到錯誤(java:不兼容的類型:MyClass 無法轉(zhuǎn)換為 MyClass)。不會編譯: MyClass<Float> myInstance = new MyClass<>().withFoo(42);我可以通過兩次指定類型來使其工作,如下所示:工作正常: MyClass<Float> myInstance = new MyClass<Float>().withFoo(42);有沒有更好的方法來編寫代碼,以便將泛型類型正確地傳遞到賦值運算符的右側(cè)?
查看完整描述

1 回答

?
鳳凰求蠱

TA貢獻(xiàn)1825條經(jīng)驗 獲得超4個贊

我能做到這一點的唯一兩種方法是添加一個指定類型的構(gòu)造函數(shù)參數(shù):


MyClass<Float> instance = new MyClass<>(0.f).withFoo(42).withBar("helloworld");

或者通過添加“終端投射”方法:


public class MyClass<T> {

  // ...


  public MyClass() { ... }


  public <U> MyClass<U> cast() {

    MyClass<U> copy = new MyClass<>();

    return copy.withFoo(foo).withBar(bar);

  }


  public MyClass<T> withFoo(int foo) { ... }

  public MyClass<T> withBar(String bar) { ... }

}

然后你可以像這樣調(diào)用它:


MyClass<Float> instance = new MyClass<>().withFoo(42).withBar("helloworld").cast();

第三種方法是提供一個MyClass<Float>專門用于創(chuàng)建實例的工廠方法:


static MyClass<Float> newFloatInstance() { return new MyClass<>(); }

然后你可以像這樣調(diào)用它:


MyClass<Float> instance = newFloatInstance().withFoo(42).withBar("helloworld");

但我猜你可能真的不想為每種可能的類型都使用工廠方法。


但是請注意,如果您能夠在不向 cast 方法(或構(gòu)造函數(shù))提供將其實例與其MyClass類型參數(shù)相關(guān)聯(lián)的情況下執(zhí)行此操作,那么您實際上不需要類上的類型變量。


您可以將類型變量推送到需要該類型變量的方法上:


public class MyClass {

  // ...


  public <T> T doSomethingToSpecificType(List<T> list, T arg) {

    // do something type-specific.

  }

}


查看完整回答
反對 回復(fù) 2023-06-04
  • 1 回答
  • 0 關(guān)注
  • 164 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號