[英]returning calling class when using generic method in abstract class
我有一个奇怪的问题,我无法理解。 我猜是因为我不熟悉 generics。
public abstract class AbstractClass <T extends AbstractClass <T>> {
//...
public <T extends AbstractClass> T genericMethod(){
//do stuff
return (T) this;
}
}
不与非抽象 Class 一起使用
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
是 class 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;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.