在Java 6中使用2个通用参数实现回调接口

时间:2015-11-26 12:05:02

标签: java function generics interface callback

// 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) { ... }
}

1 个答案:

答案 0 :(得分:0)

Logger类的write方法可能有以下签名: void write(Callback<? extends Object, Void> callback),除了Void类型

之外,它不会让你通过

如果它是您的记录器类实现,您可以更改签名,它应该是类似的 void write(Callback<? extends Object, ? extends Object> callback)允许您使用任何类型