我有一个具有以下方法的类:
public abstract class TypedMessage<T>{
public TypedMessage<T> setBody(byte[] body) {
this.body = body;
return this;
}
在一个子类中TypedMessage
,我想重载这个方法。所以我做了以下事情:
public class ThriftMessage<T extends TBase> extends TypedMessage<T>{
public TypedMessage<T> setBody(T body) {
byte[] data = ThriftMessageUtils.messageBodyToByteArray(body);
this.body = data;
return this;
}
T
注意泛型的约束。它必须扩展TBase
。这一切都编译得很好。现在,当我在这样声明的类中使用它时:
public abstract class CQSTask<CQSEvent extends TBase>{
protected void sendCQS(CQSEvent cqsEvent) throws Exception{
TypedMessage<CQSEvent> message =
new ThriftMessage<CQSEvent>(getCQSEventClass())
.setBody(cqsEvent) //<---Compile error
setBody()
引发编译错误。它试图参考:
public TypedMessage<T> setBody(byte[] body)
中方法的版本,TypedMessage
而不是中的重载版本ThriftMessage
。
这很令人困惑,因为在我声明泛型参数的类中,我CQSEvent
也有它扩展的约束TBase
。谁能帮我理解为什么它不尝试引用重载版本?
更新:
这是错误消息
error: incompatible types: CQSEvent cannot be converted to byte[]
.setBody(cqsEvent);
^
其中 CQSEvent 是一个类型变量: CQSEvent 扩展了在类 CQSTask 中声明的 TBase