Java泛型类中void foo(T y)和<T> void foo(T y)之间的区别

ele*_*ven 3 java generics object-oriented-analysis

详细解释Java泛型类的以下两个版本之间的差异(如果有)?

class C<T>{
    T x;
    void foo(T y)  { … }
}
Run Code Online (Sandbox Code Playgroud)

class C<T>{
    T x;
    <T> void foo(T y)  { … }
}
Run Code Online (Sandbox Code Playgroud)

还有一个问题:什么可以写在foo()的主体中,取代导致Java编译器接受C的第一个版本但拒绝C的第二个版本的"...".

我很困惑.

tru*_*ity 10

class C<T>{
    T x;
    <T> void foo(T y)  { … }
}
Run Code Online (Sandbox Code Playgroud)

是一种令人困惑的写作方式

class C<T>{
    T x;
    <S> void foo(S y)  { … }
}
Run Code Online (Sandbox Code Playgroud)

至于什么会拒绝第二个版本,例如:

class C<T>{
    T x;
    <T> void foo(T y)  { x = y; }
}
Run Code Online (Sandbox Code Playgroud)

会失败,因为如果你把它重写为

class C<T>{
    T x;
    <S> void foo(S y)  { x = y; }
}
Run Code Online (Sandbox Code Playgroud)

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