我有一个叫做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的类型参数声明。



*注意:原始类型是没有类型参数(例如ClassTResult)而不是Class<T>TResult<T>引用的泛型类型。

关于java - Java泛型调用返回<Textends>对象的方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31368645/

10-13 09:35