有人可以解释这个java泛型语法吗?

时间:2012-03-20 09:02:17

标签: java generics

public static <T> List<T> listAndCast(Query query) {
        @SuppressWarnings("unchecked")
        List<T> list = query.list();
        return list;
    }

在以下行中:

public static <T> List<T> listAndCast(Query query) {

为什么我们需要<T>

4 个答案:

答案 0 :(得分:6)

<T>告诉Java它是一个定义自己的类型参数的泛型方法,而不是依赖于为整个类定义的方法,例如。

public class Stuff<T> {}

答案 1 :(得分:2)

它根本没有帮助。

在呼叫站点,它允许您使用任何类型参数将结果分配给List,这不是非常类型安全的。所有这些代码只会给你一种虚假的安全感。如果它返回,例如,List<String>然后如您所写,您将被允许将该结果分配给List<Integer>并且您不会知道您已经搞砸了很久以后(当您尝试时)并访问List的一个元素并将其分配给Integer),隐含的演员会在你脸上爆炸。

通常,如果泛型方法(例如,具有自己的类型参数与其成员的类别分开的方法)仅使用其类型参数一次和/或仅将其用于返回值,则完全浪费时间!

答案 2 :(得分:0)

这就是告诉java listAndCast是一个依赖于T类型的泛型方法。

旁注:我更喜欢这个实现这个问题,因为它更通用:

@SuppressWarnings("unchecked")
public <T> List<T> list_cast(List<?> orig) {
    return (List<T>)orig;
}

答案 3 :(得分:0)

您不需要<T>,但它会停止编译器警告。编译器将推断将返回List<Object>(它没有关于将返回的类型的其他信息)。

它基本上与:

相同
public static List listAndCast(Query query)

没有关于原始类型的警告。

如果传递的参数用<T>参数化,

<T>可能会有用,例如:

public static <T> List<T> listAndCast(Query<T> query)