【问题标题】:What does a generic in front of a method mean?方法前面的泛型是什么意思?
【发布时间】:2020-01-12 20:48:32
【问题描述】:

我找到了一个基本上是这样的函数:

<R> MyClass<R> functionName(){}

我不知道前面的&lt;R&gt; 是什么意思,我通过谷歌搜索并没有真正找到任何东西。我知道泛型是什么,我只是不知道它们在那个特定位置做什么。

【问题讨论】:

  • 删除它,看看会发生什么。
  • 谢谢,这是一个很好的提示。所以这意味着我可以在执行方法时决定泛型类型,而不必在创建我的类时这样做?
  • 泛型类和泛型方法是不同的野兽。有时您只需要方法中的泛型参数,例如对于静态方法,您别无选择。

标签: java function generics


【解决方案1】:

它将让您编写可以充当任何类型的通用辅助方法的方法。

这是一个反转 List 实现的内容并将其返回到 ArrayList 的示例。

        List<String> liststr = new ArrayList<>(List.of("A","B","C"));
        List<String> reversed = reverse(liststr);
        System.out.println(reversed);

        List<Integer> listint = new ArrayList<>(List.of(1,2,3,4));
        List<Integer> reverseint = reverse(listint);
        System.out.println(reverseint);

这是方法。


    public static <T>  List<T> reverse(ArrayList<T> list) {
        List<T> rev = new ArrayList<>();
        for (int i = list.size()-1; i >= 0; i--) {
            rev.add(list.get(i));
        }
        return rev;
    }

这可以通过不同的方式完成,但它需要casting 的返回值,并且还可能生成runtime cast exception

与所有泛型方法和类一样,类型冲突将在compile time 而非runtime 解决。

【讨论】:

    【解决方案2】:

    第一种是声明functionName会使用泛型,一般我们用R来表示“return”,意思是这个函数会返回一个MyClass的实例,该实例操作R对象。

    为了更好地理解,如果 functionName 是静态的,这是一种调用 functionName 的方法:

    public class AClass{
    
       class MyClass<TYPE>{}
    
       static <R> MyClass<R> functionName(){return null;}
    
       public static void main(String[] args) {
          AClass.<String>functionName();
       }
    
    }
    

    【讨论】:

      【解决方案3】:

      这意味着R是一个变量,在方法执行时赋值,可以赋值给任何类。 这可能会有所帮助:What are Generics in Java?

      【讨论】:

        猜你喜欢
        • 2020-08-30
        • 2020-12-04
        • 1970-01-01
        • 2012-04-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-19
        • 2021-04-07
        相关资源
        最近更新 更多