Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
void foo(T y)与<;T>;Java泛型类中的void foo(ty)_Java_Generics_Object Oriented Analysis - Fatal编程技术网

void foo(T y)与<;T>;Java泛型类中的void foo(ty)

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>

详细解释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> 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; }
}