返回类型为Java泛型

返回类型为Java泛型,java,generics,Java,Generics,我见过一些这样的代码,但无法理解其意义: public class ClassA{ public <T> void getContactName(ContactList<T> contactList){ //do something } } 公共类ClassA{ public void getContactName(联系人列表ContactList){ //做点什么 } } 基本上我不明白这一点。该类编译时没有任何错误。我认为ClassA也

我见过一些这样的代码,但无法理解其意义:

public class ClassA{

public <T> void getContactName(ContactList<T> contactList){
    //do something
}    

}
公共类ClassA{
public void getContactName(联系人列表ContactList){
//做点什么
}    
}
基本上我不明白这一点。该类编译时没有任何错误。我认为ClassA也应该使用参数“T”进行泛型

谢谢你的定义

public <T> void getContactName(ContactList<T> contactList){
    //do something
}    
public void getContactName(联系人列表ContactList){
//做点什么
}    
这意味着只有方法是泛型的,而名为
T
的类型仅在方法的范围内有效。如果
T
type参数仅在单个方法中使用,则类不需要是泛型的

作为旁注,请记住,在Java中,您可以使其成为泛型:

  • 类(匿名类除外)
  • 方法
  • 接口
但你不能让它成为通用的:

  • 例外情况
  • 匿名类
  • 列举

在Java教程中以及泛型方法的详细示例和用法中,对其进行了更好的解释

下面是一个示例(内置
数组
类)。请看一看方法签名,它确保方法返回类型与方法参数完全相同,因为类本身不是泛型的,但您可以将方法设置为泛型的

class Arrays {
    public static <T> List<T> asList(T... a) {
    ...
}
类数组{
公共静态列表asList(T…a){
...
}

您可以如上所述创建
静态通用实用程序方法
,其中
不需要创建类的对象。

根据Java语言规范:

  • 类型变量是非限定标识符。类型变量是 由泛型类声明、泛型接口引入 声明、泛型方法声明和泛型构造函数 声明
  • 如果类声明了一个或多个类型变量,则该类是泛型的 类型变量称为类的类型参数 定义一个或多个用作参数的类型变量。泛型 类声明定义了一组参数化类型,每个类型一个 可能调用类型参数部分。所有这些 参数化类型在运行时共享同一个类
  • 如果接口声明了一个或多个类型变量,则该接口是泛型的。 这些类型变量称为 接口。它定义一个或多个作为 泛型接口声明定义了一组类型, 一个用于类型参数节的每个可能调用。全部 参数化类型在运行时共享同一接口
  • 如果方法声明了一个或多个类型变量,则该方法是泛型的 类型变量称为方法的形式类型参数。 形式类型参数列表的形式与类型相同 类或接口的参数列表
  • 构造函数可以声明为泛型,与 在其中声明构造函数的类本身是泛型的 如果构造函数声明一个或多个类型变量,则它是泛型的。 这些类型变量称为 构造函数。形式类型参数列表的形式相同 指向泛型类或接口的类型参数列表
您可以这样使用您的方法:

new ClassA().<String>getContactName(contactList);

您可以阅读规范以了解更多详细信息和常见问题解答,您可以找到

嗯,返回类型为void。泛型参数只是确保两个方法参数使用相同的泛型类型。抱歉,让我更改方法。添加方法签名是否不够?为什么我们需要在void之前添加?因为我们必须告诉Ja我们将使用一个名为
T
的类型,因为我们没有在类级别定义它,所以我们在方法级别定义它。
void
之前的
只是声明泛型类型参数。它告诉编译器,
T
是泛型类型-在您的情况下没有任何限制。
void
之前的
不是泛型类型返回类型的一部分。它位于方法修饰符和返回类型之间。我同意语法有点复杂,
public void getContactName(ContactList ContactList)
更合理,但Sun就是这样决定的。
new ClassA().getContactName(contactList);