java - 在抽象类中使用泛型方法时返回调用类
问题描述
我有一个奇怪的问题,我无法理解。我想这是因为我不熟悉泛型。
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
s 是不同T
的 s。第一个T
是类的泛型参数AbstractClass
。第二个T
是通用参数genericMethod
。这两个T
s 不相关,并且是独立推断的。
当你这样做时:
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;
}
}
推荐阅读
- python - 用python计算无限量给定函数的无限近似值作为参数
- c# - 如何在 C# 中将库存保存在 JSONString 中
- java - Android.os.FileUriExposedException 错误,Android Studio
- swift - ParseSwift ParseObject QueryConstraint
- php - 使用 Microsoft Graph API (PHP) 更新用户
- java - 我尝试了几个选项,但仍然出现此错误:org.testng.TestNGException:检查以确保它可以被实例化
- c++ - 按升序对行长度 + 字母顺序进行排序
- reactjs - 如何在 EC2 实例上预览我的 react-app?
- javascript - jQuery scrollTop 在 iOS 12 上不滚动
- java - 递增/更新 MySQl 表中一行中的值