使用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编译器的方式重写它们吗?
答案 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;
}