【问题标题】:Java-syntax for explicitly specifying generic arguments in method calls用于在方法调用中显式指定泛型参数的 Java 语法
【发布时间】:2010-06-10 08:27:05
【问题描述】:

为泛型 Java 方法显式提供类型参数的语法是什么?

【问题讨论】:

    标签: java generics


    【解决方案1】:

    根据Java specification,例如:

    Collections.<String>unmodifiableSet()
    

    (很抱歉提出并回答了我自己的问题 - 我只是第三次查找这个问题。:-)

    【讨论】:

      【解决方案2】:

      以下是不是的语法

      <ArgType>genericMethod()
      

      似乎类型参数必须跟在一个点之后

      SomeClass.<ArgType>genericMethod()
      this.<ArgType>genericMethod()
      p.<ArgType>genericMethod()
      super.<ArgType>genericMethod()
      SomeClass.super.<ArgType>genericMethod()
      SomeClass.this.<ArgType>genericMethod()
      

      【讨论】:

      • 这对于import static 方法如何工作?它没有附加到类或this,并且正如您所说,列出的第一个语法不起作用。
      • @Coderer 那么静态方法必须在某个类中,所以你可以使用SomeClass.&lt;ArgType&gt;genericMethod()。如果您没有导入该类,则使用该类的 FQN。我相信你知道这一点,并希望得到一个更令人满意的答案。就我个人而言,我不明白为什么不能将 &lt;ArgType&gt;genericMethod() 语法添加到语言中;它会产生歧义吗?
      • 其实我并没有尝试过类的FQN,我只是从import static pack.MyClass.someMethod; someMethod();切换到import pack.MyClass; MyClass.&lt;ArgType&gt;someMethod(),但当然它仍然比你给出的“希望这有效”反例更冗长答案。
      • 这称为类型见证
      • 是的。有时类型参数被称为类型见证。很高兴知道,我以前不知道。 JLS 使用术语类型参数。 Java 教程的泛型跟踪有时使用 type argument,有时使用 type witness
      【解决方案3】:

      java.util.Collection 的一个很好的例子是指定一个定义自己的泛型类型的泛型方法是Collection.toArray,其中方法签名如下所示:

      <T> T[] toArray(T[] a);
      

      这声明了一个泛型类型 T,它在方法调用时由参数 T[] a 定义,并返回一个 T 数组。所以同一个实例可以以通用方式调用 toArray 方法:

      Collection<Integer> collection = new ArrayList<Integer>();
      collection.add(1);
      collection.add(2);
      
      // Call generic method returning Integer[]
      Integer[] ints = collection.toArray(new Integer[]{});
      
      // Call generic method again, this time returning an Number[] (Integer extends Number)
      Number[] nums = collection.toArray(new Number[]{});
      

      另外,请参阅java tutorial on generic type parameters

      【讨论】:

      • 也许你可以用关于显式地为调用提供类型参数的部分来扩展它(比较我的答案)。那么这将是一个很好的规范答案;因为它甚至没有回答问题,因为参数是由编译器在调用中隐式推导出的。 :-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-22
      • 1970-01-01
      • 2015-08-01
      • 2016-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多