Java 什么使泛型类型参数的名称成为泛型?

Java 什么使泛型类型参数的名称成为泛型?,java,generics,Java,Generics,我正在为自己写一本java手册,我喜欢把事实放进去。 我似乎无法描述泛型类型参数。我想知道哪个名称对编译器来说是泛型类型,而不是现有对象。我知道惯例是字母“T”和其他单个字母。但我在oracle.docs.com上看到了这样一个例子: class name<T1, T2, ..., Tn>{} 然后,如果我创建了一个方法,并将类的名称键入错误,请执行以下操作: void Method(Bob parameter){} 这是否只是编译并使参数成为泛型类型?任何名称都可以是泛型类型参

我正在为自己写一本java手册,我喜欢把事实放进去。 我似乎无法描述泛型类型参数。我想知道哪个名称对编译器来说是泛型类型,而不是现有对象。我知道惯例是字母“T”和其他单个字母。但我在oracle.docs.com上看到了这样一个例子:

class name<T1, T2, ..., Tn>{}
然后,如果我创建了一个方法,并将类的名称键入错误,请执行以下操作:

void Method(Bob parameter){}

这是否只是编译并使参数成为泛型类型?

任何名称都可以是泛型类型参数。如果声明泛型类型参数Bob,并使用该名称而不是预期的类名Boby,编译器会将其识别为泛型类型参数

顺便说一句,如果您声明泛型类型参数
Boby
,它将隐藏类名
Boby
,因此在定义泛型类型参数的范围内(在整个类内或单个方法内)的任何位置写入
Boby
,都将引用泛型类型参数,不适用于
Boby

class Something<Bob> {
    void Method1(Bob parameter){} // refers to the generic type parameter Bob

    void Method2(Boby parameter){} // refers to the Boby class
}

class Something<Boby> {
    void Method(Boby parameter){} // refers to the generic type parameter Boby,
                                  // hiding the Boby class
}

class Something<T> {
    void Method(Bob parameter){} // compilation error - Bob is an undefined symbol
}
分类{
void Method1(Bob参数){}//引用泛型类型参数Bob
void Method2(Boby参数){}//引用Boby类
}
分类{
void方法(Boby参数){}//引用泛型类型参数Boby,
//隐藏Boby类
}
分类{
void方法(Bob参数){}//编译错误-Bob是未定义的符号
}

也就是说,为了使代码更具可读性,最好使用一个大写字母作为类型参数名

类上声明的类型参数会隐藏任何实际类,就像本地类一样:

interface HasValue {
    int getValue();
}
class Foo {
}

class Bar implements HasValue {
    private int value;

    public Bar(int v) {
        this.value = v;
    }
    public int getValue() {
        return this.value;
    }
}

class Example<Foo extends HasValue> {
    public static final void main(String[] args) throws Exception {
        Example<Bar> e = new Example<>();
        e.method(new Bar(42));
    }

    public void method(Foo x) {
        System.out.println("x.getValue() is " + x.getValue());
    }
}
接口值{
int getValue();
}
福班{
}
类栏实现HasValue{
私有int值;
公共酒吧(INTV){
该值=v;
}
public int getValue(){
返回此.value;
}
}
课例{
公共静态最终void main(字符串[]args)引发异常{
示例e=新示例();
e、 方法(新条(42));
}
公共作废法(Foo x){
System.out.println(“x.getValue()是”+x.getValue());
}
}

这很好,因为在
Example
中,
Foo
是一个类型参数,而不是类
Foo

,编译器要知道类是否用作泛型,需要这样指定它:

public class MyClass<T> {}

T1
声明为泛型参数(Java语言规范中的类型变量),如果
Bob
未声明为泛型参数,则不会将其解释为泛型参数(类似于变量声明)。示例
void方法(Bob参数)
为什么不测试它呢?对于泛型方法,它必须声明至少有一个泛型类型。你为什么不尊重命名惯例呢?这应该是指南的最开始,早在泛型之前,您就可以了解JLS(Java语言规范),它定义泛型参数以及如何处理名称冲突。一般来说,泛型参数必须在
中声明,IIRC优先于类名-这就是泛型类型通常被命名为
T
V
T2
等的原因-因为类通常有更长更有意义的名称。很好的解释谢谢。我把参数的概念搞错了。虽然它们可以在任何地方作为未声明类型的参数lol,但这将是一个童话:D
public class MyClass<T> {}
List<Bob> bobyes = new ArrayList<Bob>();
foreach (Bob bob : bobyes)
   if (bob instanceof Bob)
      true; -- in this case always true;