用javac编译器编译泛型

用javac编译器编译泛型,java,eclipse,generics,compilation,javac,Java,Eclipse,Generics,Compilation,Javac,我在使用javac(与java泛型相关)时遇到以下错误 代码在eclipse中编译得很好(因为它不使用javac) 我在以下代码中遇到错误: public <T extends Comparable<T>> TRange<T> valueToRange(T val, List<T> rangeValues) { List<T> vals = rangeValues; if (vals == null) {

我在使用javac(与java泛型相关)时遇到以下错误

代码在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);
}

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

第一个代码片段实际上很危险:您试图将
List
转换为
List
,其中
T
可比的
。您可能会在
compariable
列表中出现不可比较的项,这可能会在运行时产生突然的
ClassCastException
。如果不知道三个参数
valueToRange
的实现,我就不能说如何正确地解决这个问题。但是,如果您仍然认为这是可以的,并且只希望此代码是可编译的,那么您可以再添加一个cast:

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);
}
公共交易值范围(T值,列出范围值){
列表VAL=范围值;
如果(VAL==null){
VAL=(列表)(列表)(this.values!=null?this.values:this.defaultValues);
}
返回值范围(val、val、此范围);
}
对于第二个示例,您可以执行类似的操作:

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;
}
公共静态类getEnumClass(字符串unitValueClassName){
unitValueClassName=normalizeEnumClassName(unitValueClassName);
课堂讨论;
if(unitValueClassName.equals(密度){
clazz=密度单位.class;
}else if(unitValueClassName.equals(LENGTH_CLS)){
clazz=LengthUnit.class;
}else if(unitValueClassName.equals(长度\可选\ CLS)){
clazz=LengthUnit.class;
}else if(unitValueClassName.equals(VOLUME_CLS)){
clazz=VolumeUnit.class;
}else if(unitValueClassName.equals(WEIGHT_CLS)){
clazz=权重单位.class;
}else if(unitValueClassName.equals(TIME_CLS)){
clazz=TimeUnit.class;
}否则{
抛出新的IllegalArgumentException(“请将枚举类添加到UnitValueView.getEnumClass(字符串):”+unitValueClassName);
}
返回(类)clazz;
}

您为什么选择不发布您的问题所涉及的错误消息?首先,
(类)
由于类型擦除而无效。应该是
(Class)
,这是您可以安全获得的更精确的值。如果您确实需要它是泛型的,那么应该调用
Class.cast
在第一个示例中,您正试图将
列表
转换为
列表
-为什么?
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;
}