Javagenerics方法声明基础

我开始学习Java Generics ,我读了几个教程,但我有点困惑,不知道如何声明generics方法。

当我使用generics类型时,定义方法的正确顺序是什么? 我找到了这个样本,什么时候需要使用尖括号?

 public class Box { private A a; ... public void setA(A a) { this.a = a; } public  List transform(List in) { return null; } public static  A getFirstElement(List list) { return null; } public A getA() { return a; } 

问题是你的代码使用相同的字符A,但它在不同的地方有几个不同的“含义”:

 public class Box { 

需要括号,因为你在这里说:Box使用generics类型,称为T.

T的用法没有括号:

 private T a; public void setA(T a) { 

但是之后

 public  List transform(List in) { 

正在引入另一种类型参数。 我把它命名为T2,以表明它与T不同。想法是T2的范围 只是一个方法transform 。 其他方法不知道T2!

 public static  A getFirstElement(List list) { 

与上面相同 – 这里将是“T3”;-)

编辑您的评论:您不能使用静态方法使用类范围类型T.这根本不可能! 看到这里是为什么!

编辑2:generics允许您编写通用的代码(因为它可以处理不同的类); 但仍然给你编译时的安全性。 例:

  Box stringBox = new Box<>(); Box integerBox = new Box<>(); integerBox.add("string"); // gives a COMPILER error! 

在人们使用仿制药之前,他们只能在整个地方处理对象 ; 和手工铸造。

您的示例显示了两个不同的概念: generics类generics方法

这是一个引入类型参数generics类

 public class Box { } 

虽然这些是引入自己类型参数 通用方法

 public  List transform(List in) { return null; } public static  A getFirstElement(List list) { return null; } 

将它与具有特定名称字段的类和具有该名称参数的方法进行比较:

 public class Box { private String name; publix Box(String name) { } } 

如果您的方法中有一个需要返回类型的要求取决于您当时的方法参数,您可以在方法签名之前编写尖括号,如示例所示,简而言之,如单词建议Generic用于相同的function需要用于多种类型对象的类或实用程序