在抽象 class 中使用泛型方法时返回调用 class
returning calling class when using generic method in abstract class
我有一个奇怪的问题,我无法理解。我猜是因为我对泛型不熟悉。
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;
}
}
我有一个奇怪的问题,我无法理解。我猜是因为我对泛型不熟悉。
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;
}
}