我有一个叫做TResult的类
public class TResult<T extends MyEntity> {
public List<T> getEntityList() {
return entityList;
}
}
我在其他一些类中有一个静态方法返回它
public static TResult getAllEntities(final Class clazz, RouteFilter filter ){
}
现在,当我调用getAllEntities时,需要将其强制转换为MyEntity,否则会收到警告(未检查的分配)。
我尝试更改方法签名,并且仅适用于
public static <T extends APIBaseEntity> TResult<T> getAllEntities(final Class clazz, RouteFilter filter) {}
当TResult类签名中已定义T时,为什么要指出T扩展了APIBaseEntity?
TResult<APIBaseEntity> allEntities = GeneralCRUD.getAllEntities(APIAccount.class, filter);
最佳答案
首先,您不应该使用原始类型*,它可以帮助您了解通用类在做什么。
问自己以下问题:clazz
是什么课?您要返回哪种TResult
?提供的类是否应该定义TResult
的类型参数?
如果对最后一个问题的回答是“是”,那么您可能正在寻找这样的声明:
public static <T extends APIBaseEntity> TResult<T> getAllEntities(final Class<T> clazz, RouteFilter filter) {
//...
}
基本上,这将强制返回的
TResult<T>
与提供的T
具有相同的类型clazz
:方法的类型参数。这也消除了强制转换为所需返回类型的负担,因为编译器现在已经知道了。当TResult类签名中已定义T时,为什么要指出T扩展了APIBaseEntity?
如果编写
public <T> TResult<T> myMethod()
,则T
是方法的通用类型,但完全不受限制,因此可以是任何形式。 TResult<T>
不用作方法的类型参数的约束。您必须自己明确约束它,因为您甚至可以约束它的范围比TResult
类(例如,子类型为APIBaseEntity
)更多。如果不限制方法的类型参数,则会出现编译错误/警告(不记得我的想法),因为它不适合
TResult
的类型参数声明。*注意:原始类型是没有类型参数(例如
Class
或TResult
)而不是Class<T>
或TResult<T>
引用的泛型类型。关于java - Java泛型调用返回<Textends>对象的方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31368645/