我有一个奇怪的问题,我无法理解。我猜是因为我不熟悉泛型。
public abstract class AbstractClass <T extends AbstractClass <T>> {
//...
public <T extends AbstractClass> T genericMethod(){
//do stuff
return (T) this;
}
}
不与非抽象类一起使用
public class MyClass extends AbstractClass <MyClass> {
//...
public void anotherMethod() {
//do other stuff
}
}
到目前为止或多或少还可以(也许不理想,但是还可以)。现在令人困惑的部分:
private MyClass stubWithMyClassAsReturnValue(){
//more stuff
return new MyClass();
}
public void test1(){
MyCalss myClass = stubWithMyClassAsReturnValue().genericMethod();
myClass.anotherMethod();
//---> works just fine
}
public void test2(){
stubWithMyClassAsReturnValue().genericMethod().anotherMethod();
//---> compiling error because AbstractClass does not know about anotherMethod(),
// so genericMethod() returns AbstractClass and not MyClass
}
我想有某种隐式转换。如何使代码更流畅,并摆脱多余的“ myClass”?我很确定这是一个明显的错误,但我看不到。
使用此代码:
// this T
// v
public abstract class AbstractClass <T extends AbstractClass <T>> {
// and this T
// v
public <T extends AbstractClass> T genericMethod(){
//do stuff
return (T) this;
}
}
突出显示的两个T
是不同的T
。第一个T
是类AbstractClass
的通用参数。第二个T
是genericMethod
的通用参数。这两个T
不相关,可以独立推断。
执行此操作时:
stubWithMyClassAsReturnValue().genericMethod()
编译器知道第一个T
是-MyClass
,但不知道第二个T
应该是什么,因此它仅使用上限-AbstractClass
。但是anotherMethod
在AbstractClass
中不可用,因此会出现错误。
您可能只需要一个T
:
public abstract class AbstractClass <T extends AbstractClass <T>> {
public T genericMethod(){
//do stuff
return (T) this;
}
}