繁体   English   中英

void foo(T y)和 <T> Java泛型类中的void foo(T y)

[英]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; }
}

您可以立即看到您错过了演员表(确切的编译器错误是“不兼容的类型”)。

在第一个示例中,方法fooT类型变量表示在类定义C<T>声明的非常相同的类型。

第二个例子是一个陷阱,因为方法声明中的T是与类的类型参数无关的完全不同的类型,它恰好具有相同的名称T 当局部变量隐藏同名字段时,情况类似。

对于这种情况,Eclipse发出一个很好的编译器警告(如果在设置中打开此警告,不确定它是否默认打开):

类型参数T隐藏类型T.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM