我有像
这样的代码private List<xyzClass> fieldName;
public List<xyzClass> getFieldName(){
return fieldName;
}
public void setFieldName(List<xyzClass> abc){
this.fieldName= abc;
}
但是当编译为java字节代码时,缺少参数 如下:
private List fieldName;
public List getFieldName(){
return fieldName;
}
public void setFieldName(List abc){
this.fieldName= abc;
}
这会导致SOAP出现问题,因为无法对xyzClass异常进行类型转换。
从Eclipse我看到创建的类文件很好 但是当我尝试使用命令行javac或maven时,类文件缺少这些参数。
答案 0 :(得分:6)
这是type erasure的结果。基本上,java使用泛型来确认您在编译期间没有违反类型约束。然后删除所有泛型并替换为继承层次结构中的最高类。这将默认为Object
,但如果您说<T extends ParentClass>
(例如),则T
代理将替换为ParentClass
。
答案 1 :(得分:2)
这称为Type Erasure。
使用泛型的任何对象都使用边界进行编译。这提供了一种使代码安全的方法。&#34;类型安全。&#34;由于Java是静态类型语言,因此必须事先定义所有变量。这提供了一种方法来防止可能导致异常的强制转换,最明显的是ClassCastException
s。任何类型参数都替换为Object。像这样:
源代码:
public class Hi<Type>
{
public void sayHi(Type t)
{
...
将编译为......
public class Hi<Type>
{
public void sayHi(Object t)
{
...
当您对通用设施施加限制时,这当然会有所不同,尤其是在使用extends
关键字时。例如:
public class Hi<Type extends Number>
{
public void sayHi(Number t)
{
...