簡體   English   中英

在Java 6中使用2個通用參數實現回調接口

[英]Implementing Callback Interface using 2 generic parameters in Java 6

// interface
public interface Callback<T, R> {
    R execute(T arg);
}

// application code
logger = MetricLogger.getInstance(app);

logger.write(new Callback<LogFormat, Void>() {
    @Override
    public Void execute(LogFormat arg) {
        // do something
        return null;
    }
 });

當我返回Void類型時,上面的代碼可以編譯並運行。

但是我不能使用Long作為返回類型。 例如

logger = MetricLogger.getInstance(app);

// doesn't compile
logger.write(new Callback<LogFormat, Long>() {
    @Override
    public Long execute(LogFormat arg) {
        return null;
    }
});

錯誤消息是,

錯誤:((66,22)錯誤:不兼容的類型:匿名Callback <LogFormat,Long>無法轉換為Callback<LogFormat,Void>

Java 6不支持通用返回類型嗎?
還是我錯過了什么?

================================================== ===============

更新

我發現這些代碼可以編譯 但我不確定哪一個是正確的

// Solution 1
public interface Callback<T> {
  <R> R execute(T arg)
}

new Callback<LogFormat>() {
  @Override
  public Long execute(LogFormat arg) { ... }
}

// Solution 2
public interface Callback {
  <T, R> R execute(T arg)
}

new Callback<LogFormat>() {
  @Override
  public <LogFormat, Long> Long execute(LogFormat arg) { ... }
}

Logger類上的write方法可能具有如下簽名: void write(Callback<? extends Object, Void> callback) ,除了Void類型之外,它不允許您傳遞

如果是記錄程序類的實現,則可以更改簽名,它應該類似於void write(Callback<? extends Object, ? extends Object> callback)以允許您使用任何類型

暫無
暫無

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

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