使用javac编译器

时间:2016-01-10 17:14:27

标签: java eclipse generics compilation javac

使用javac(与java泛型相关)时出现以下错误

:inconvertible types
[ERROR] required: (...)
[ERROR] found:    (...)

代码在eclipse中编译得很好(因为它没有使用javac)。

我在以下代码中遇到错误:

public <T extends Comparable<T>> TRange<T> valueToRange(T val, List<T> rangeValues) {
    List<T> vals = rangeValues;
    if (vals == null) {
        vals = (List<T>) (this.values != null ? this.values : this.defaultValues);
    }
    return valueToRange(val, vals, this.range);
}

其中值defaultValues属于List

Serializable类型

public static <T extends Enum<T> & Unit> Class<T> getEnumClass(String unitValueClassName) {
    unitValueClassName = normalizeEnumClassName(unitValueClassName);

    if (unitValueClassName.equals(DENSITY_CLS)) {
        return (Class<T>) DensityUnit.class;
    }
    if (unitValueClassName.equals(LENGTH_CLS)) {
        return (Class<T>) LengthUnit.class;
    }
    if (unitValueClassName.equals(LENGTH_OPTIONAL_CLS)) {
        return (Class<T>) LengthUnit.class;
    }
    if (unitValueClassName.equals(VOLUME_CLS)) {
        return (Class<T>) VolumeUnit.class;
    }
    if (unitValueClassName.equals(WEIGHT_CLS)) {
        return (Class<T>) WeightUnit.class;
    }
    if (unitValueClassName.equals(TIME_CLS)) {
        return (Class<T>) TimeUnit.class;
    }
    throw new IllegalArgumentException("Please add the enum class to UnitValueView.getEnumClass(String) : " + unitValueClassName);
}

我们可以用另一种保持相同功能但通过javac编译器的方式重写它们吗?

1 个答案:

答案 0 :(得分:0)

第一个代码段实际上很危险:您正试图将List<Serializable>转换为List<T> T Comparable<T>。您最终可能会在Comparable列表中找到不可比较的项目,这些项目可能会在运行时突然出现ClassCastException。在不知道三参数valueToRange的实现的情况下,我不能说如何正确地解决这个问题。但是如果你仍然认为这是可以的并且只是想要编译这个代码,你可以添加一个演员:

public <T extends Comparable<T>> TRange<T> valueToRange(T val, List<T> rangeValues) {
    List<T> vals = rangeValues;
    if (vals == null) {
        vals = (List<T>) (List<?>) (this.values != null ? this.values : this.defaultValues);
    }
    return valueToRange(val, vals, this.range);
}

使用第二个例子,你可以做类似的事情:

public static <T extends Enum<T> & Unit> Class<T> getEnumClass(String unitValueClassName) {
    unitValueClassName = normalizeEnumClassName(unitValueClassName);

    Class<?> clazz;
    if (unitValueClassName.equals(DENSITY_CLS)) {
        clazz = DensityUnit.class;
    } else if (unitValueClassName.equals(LENGTH_CLS)) {
        clazz = LengthUnit.class;
    } else if (unitValueClassName.equals(LENGTH_OPTIONAL_CLS)) {
        clazz = LengthUnit.class;
    } else if (unitValueClassName.equals(VOLUME_CLS)) {
        clazz = VolumeUnit.class;
    } else if (unitValueClassName.equals(WEIGHT_CLS)) {
        clazz = WeightUnit.class;
    } else if (unitValueClassName.equals(TIME_CLS)) {
        clazz = TimeUnit.class;
    } else {
        throw new IllegalArgumentException("Please add the enum class to UnitValueView.getEnumClass(String) : " + unitValueClassName);
    }
    return (Class<T>) clazz;
}