Java 不';t型参数起什么作用?

Java 不';t型参数起什么作用?,java,generics,Java,Generics,假设我有一个泛型类包和一个泛型方法,如下代码所示。该方法打印并返回x,x在方法内部被分配了一个类型参数整数 公共类包裹{ 公共X交付(){ X=(X)新整数(100); 系统输出println(x); 返回x; } } 在main中,我通过传递类型参数packet调用deliver方法。然而,它仍然打印100 publicstaticvoidmain(字符串参数[]){ 地块=新地块(); System.out.println(packet.deliver()); } 因此,在打印行中传递的

假设我有一个泛型类包和一个泛型方法,如下代码所示。该方法打印并返回x,x在方法内部被分配了一个类型参数整数

公共类包裹{
公共X交付(){
X=(X)新整数(100);
系统输出println(x);
返回x;
}
}
在main中,我通过传递类型参数packet调用deliver方法。然而,它仍然打印100

publicstaticvoidmain(字符串参数[]){
地块=新地块();
System.out.println(packet.deliver());
}

因此,在打印行中传递的类型参数Parcel不起任何作用,我希望这里出现异常。它是如何工作的?

你所观察到的被称为。编译器使用泛型参数来确保类型正确性,并且在运行时不存在泛型参数

一般来说,没有什么能阻止你做这件事:

List List=new ArrayList();
列表。附加(“”;//产生编译器错误
//别再提那个“没用”的一般性论点了
删除列表=(列表)列表;
已删除。附加(“”;//很好
编辑

事实上,我最初的答案偶尔是针对这个
实现的

公共类包裹{
公共交通工具{
T x=(T)新整数(100);
系统输出println(x);
返回x;
}
}
但是对于
X deliver()
,关键思想是相同的:

对象地块=地块。交付();//删除,工作正常
包裹=包裹。交付();//java.lang.ClassCastException

因为您要绑定到
java.lang.Object
X
不绑定到任何特定类型,假设它的上限是
java.lang.Object
,因此不存在
ClassCastException
。如果调用
deliver
并将结果强制转换为具有除
java.lang.Object
java.lang.Number
java.lang.Integer
以外的其他类型的变量/字段/参数,您将得到一个。您的代码不会因为调用
println(Object)
而失败。如果您将其更改为
parcel.deliver()
,编译器将使用
println(String)
,这将导致
java.lang.Integer无法转换为java.lang.String
此外,您可以将
约束更改为更具体的类型,并且编译器将在
deliver()
方法中使用conrete类型转换。比方说,
将导致此行出现
ClassCastException
X=(X)(Object)新整数(100)X
在这里被
java.lang.String
替换。