[英]Difference between <T extends A> void foo(T t) and void foo(A a)
[英]Difference between void foo(T y) and <T> void foo(T y) in Java generic class
详细解释Java泛型类的以下两个版本之间的差异(如果有)?
class C<T>{
T x;
void foo(T y) { … }
}
和
class C<T>{
T x;
<T> void foo(T y) { … }
}
还有一个问题:什么可以写在foo()的主体中,取代导致Java编译器接受C的第一个版本但拒绝C的第二个版本的“...”。
我很困惑。
class C<T>{
T x;
<T> void foo(T y) { … }
}
是一种令人困惑的写作方式
class C<T>{
T x;
<S> void foo(S y) { … }
}
至于什么会拒绝第二个版本,例如:
class C<T>{
T x;
<T> void foo(T y) { x = y; }
}
会失败,因为如果你把它重写为
class C<T>{
T x;
<S> void foo(S y) { x = y; }
}
您可以立即看到您错过了演员表(确切的编译器错误是“不兼容的类型”)。
在第一个示例中,方法foo
的T
类型变量表示在类定义C<T>
声明的非常相同的类型。
第二个例子是一个陷阱,因为方法声明中的T
是与类的类型参数无关的完全不同的类型,它恰好具有相同的名称T
当局部变量隐藏同名字段时,情况类似。
对于这种情况,Eclipse发出一个很好的编译器警告(如果在设置中打开此警告,不确定它是否默认打开):
类型参数T隐藏类型T.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.