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