簡體   English   中英

當類型是通配符時,如何將通用結果用作通用參數?

[英]How to use a generic result as a generic parameter when the type is a wildcard?

[更新]真實情況比我最初提出的問題要復雜一些。 我已經改變了一些代碼來反映這一點。[/ UPDATE]

我對以下行為感到有點難過。 給出如下代碼:

interface Inter<T> {
  T makeT();
  void useT(T t);
}

public class Foo {
  public void bar(Qux q) {
    Inter<?> x = getInterForQux(q);
    x.useT(x.makeT());
  }

  Inter<?> getInterForQux(Qux q) {
    if( someTest(q) ) {
      return (Inter<Integer>) mkAnInterInt();
    } else {
      return (Inter<Double>) mkAnInterDouble();
    }
  }
}

Javac給了我錯誤:

Inter <capture#478 of?>中的useT(捕獲#478?)無法應用於(java.lang.Object)

而Eclipse給了我:

Inter <capture#1-of?>類型中的方法useT(捕獲#1-of?)不適用於參數(捕獲#2-of?)

顯然,不管是什么T的結果是類型makeT()相同的參數類型的useT() 為什么我不能這樣做? 有解決方法嗎?

當您使用通配符,編譯器無法看到的返回類型x.makeT()和參數類型x.useT()是相同的。 為了保證它們是相同的,你應該在這里使用泛型方法:

public class Foo { 
    public <T> void bar(Inter<T> x) { 
        x.useT(x.makeT()); 
    } 
} 

這是合乎邏輯的,因為Inter<?>.makeT()可以返回任何內容,而Inter<?>.useT(..)會消耗任何東西,但兩個任何東西都可以不同。

那會解決它:

public <T> void bar(Inter<T> x) {
    x.useT(x.makeT());
}

使用捕獲助手:

public void bar(Qux q) {
    Inter<?> x = getInterForQux(q);
    barPrivate(x);
}
private <T> void barPrivate(Inter<T> x) {
    x.useT(x.makeT());
}

這為您提供了相同的bar簽名

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM