我有一个名为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) {}
为什么我必须指出当T已经在TResult类签名中定义时,T在getAllEntities方法中扩展了APIBaseEntity?
TResult<APIBaseEntity> allEntities = GeneralCRUD.getAllEntities(APIAccount.class, filter);
答案 0 :(得分:6)
首先,你不应该使用原始类型*,它会帮助你理解你在使用泛型类时所做的事情。
问自己这些问题:clazz
是什么类?你回来了什么样的TResult
?提供的类是否应该定义TResult
的类型参数?
如果对最后一个问题的回答是肯定的,那么您可能正在寻找这样的声明:
public static <T extends APIBaseEntity> TResult<T> getAllEntities(final Class<T> clazz, RouteFilter filter) {
//...
}
这基本上强制返回的TResult<T>
与提供的T
具有相同的类型clazz
:方法的类型参数。这也消除了转换为所需返回类型的负担,因为编译器现在已经知道了。
为什么我必须指出当T已经在TResult类签名中定义时,T在getAllEntities方法中扩展了APIBaseEntity?
如果你写public <T> TResult<T> myMethod()
,T
是你的方法的通用类型,但根本不受约束,所以它可以是任何东西。 TResult<T>
不作为方法的类型参数的约束。您必须自己明确约束它,因为您甚至可以比TResult
类更多地限制它(例如,子类型为APIBaseEntity
)。
如果您不限制方法的类型参数,则会收到编译错误/警告(不要记得从头到尾),因为它不适合{ {1}}的类型参数声明。
*注意: 原始类型是在没有类型参数的情况下引用的泛型类型,例如 TResult
或 {{1} },而不是 Class
或 TResult
。