0

来自“Java Generic and Collections”一书,第 1.4 节有这个代码片段

class Lists {
    public static <T> List<T> toList(T... arr) {
        List<T> list = new ArrayList<T>();
        for (T elt : arr)
            list.add(elt);
        return list;
    }
}

然后是这样的说法:

当一个类型参数被传递给一个泛型方法调用时,它出现在左边的尖括号中,就像在方法声明中一样。Java 语法要求类型参数只能出现在使用点分形式的方法调用中。即使 toList 方法定义在调用代码的同一个类中,我们也不能将其缩短如下:

List<Integer> ints = <Integer>toList(); // compile-time error

这是非法的,因为它会混淆解析器。

所以我试图理解为什么会出现编译器时错误。

4

1 回答 1

0

所以我试图理解为什么会出现编译器时错误。

因为那是规范。见JLS §15.12

方法调用表达式用于调用类或实例方法。

MethodInvocation :
       MethodName ( ArgumentList opt )
      主要的。NonWildTypeArguments opt  Identifier ( ArgumentList opt )
      极好的 。NonWildTypeArguments opt  Identifier ( ArgumentList opt )
       ClassName。极好的 。NonWildTypeArguments opt  Identifier ( ArgumentList opt )
       TypeNameNonWildTypeArguments 标识符(ArgumentList opt

至于为什么要这样写规范,只有语言设计者才能回答。

于 2012-08-23T02:23:11.380 回答