![](/img/trans.png)
[英]How to hide Generic type parameters from implementing class of a Callback interface
[英]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.