void foo(T y)与<;T>;Java泛型类中的void foo(ty)
详细解释Java泛型类的以下两个版本之间的差异(如果有)void foo(T y)与<;T>;Java泛型类中的void foo(ty),java,generics,object-oriented-analysis,Java,Generics,Object Oriented Analysis,详细解释Java泛型类的以下两个版本之间的差异(如果有) class C<T>{ T x; void foo(T y) { … } } C类{ tx; void foo(ty){…} } 及 C类{ tx; void foo(ty){…} } 还有一个问题:在foo()的主体中可以写些什么来替换“…”,这将导致Java编译器接受C的第一个版本,但拒绝C的第二个版本 我很困惑。C班{ class C<T>{ T x; <T>
class C<T>{
T x;
void foo(T y) { … }
}
C类{
tx;
void foo(ty){…}
}
及
C类{
tx;
void foo(ty){…}
}
还有一个问题:在foo()的主体中可以写些什么来替换“…”,这将导致Java编译器接受C的第一个版本,但拒绝C的第二个版本
我很困惑。C班{
class C<T>{
T x;
<T> void foo(T y) { … }
}
tx;
void foo(ty){…}
}
这是一种令人困惑的写作方式
class C<T>{
T x;
<S> void foo(S y) { … }
}
C类{
tx;
void foo(S y){…}
}
至于第二个版本会被拒绝的内容,例如:
class C<T>{
T x;
<T> void foo(T y) { x = y; }
}
C类{
tx;
void foo(ty){x=y;}
}
将失败,因为如果您将其重写为
class C<T>{
T x;
<S> void foo(S y) { x = y; }
}
C类{
tx;
void foo(sy){x=y;}
}
您可以立即看到缺少强制转换(确切的编译器错误是“不兼容类型”)。在第一个示例中,方法
foo
中的T
type变量表示类定义C
中声明的类型
第二个例子是一个陷阱,因为方法声明中的T
是一个与类的类型参数无关的完全不同的类型,它恰好具有相同的名称T
。这与局部变量隐藏同名字段的情况类似
对于这种情况,Eclipse会发出一个很好的编译器警告(如果在设置中打开了此警告,则不确定默认情况下是否打开):
类型参数T正在隐藏类型T
class C<T>{
T x;
<S> void foo(S y) { x = y; }
}