Java泛型调用返回<t extends =“”> object

时间:2015-07-12 14:07:13

标签: java java-8

我有一个名为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);

1 个答案:

答案 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