编译java代码时缺少参数

时间:2015-11-25 13:05:18

标签: java

我有像

这样的代码
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时,类文件缺少这些参数。

2 个答案:

答案 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) 
    {
        ...