【问题标题】:Why type parameter required before return type for static generic methods为什么在静态泛型方法的返回类型之前需要类型参数
【发布时间】:2019-02-14 23:50:20
【问题描述】:

以下noGood 方法会产生编译错误,因为它忽略了紧接在返回类型T 之前的形式类型参数。

public static T noGood(T t) {
  return t;
}

有人可以帮我理解为什么静态泛型方法需要在返回类型之前有一个类型参数吗?非静态方法不需要吗?

【问题讨论】:

    标签: java generics methods static generic-method


    【解决方案1】:

    类型参数 (T) 在您实例化类时声明。因此,实例方法不需要类型参数,因为它是由实例定义的。

    另一方面,static 方法不属于实例——它们属于类。由于没有实例可以从中获取类型信息,因此必须为方法本身指定它。

    【讨论】:

      【解决方案2】:

      T 未定义。修饰符的顺序和返回类型保持不变。

      public static <T> T noGood(T t) {
          return t;
      }
      

      【讨论】:

      • 有趣的是,这个明显没用的方法有一个用例......它通常被称为self......
      【解决方案3】:

      当您使用泛型时,您需要使用&lt;&gt; 表示法声明它们

      1. 在课堂上

        public class Foo<T, U, V>{
        
        }
        
      2. 在方法中,在返回类型之前

        public static <T, U extends Number, V> T foo(T t) {
            U u = ..;
            ...
        }
        
        public static <T> int foo(T t) {
            ...
        }
        

      【讨论】:

        【解决方案4】:

        首先,这在语言中是相当标准的。即使在 C++ 中:

        template <class myType>
        myType GetMax (myType a, myType b) {
            return (a>b?a:b);
        }
        

        您在泛型函数上方声明类型参数。

        当它是类的成员函数时,它可以访问类的类型参数。如果它不是静态的,则需要显式声明它们。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-11-06
          • 2021-07-26
          • 2014-01-06
          • 1970-01-01
          • 1970-01-01
          • 2015-09-26
          • 2021-06-28
          相关资源
          最近更新 更多