正确分配泛型类型的变量

时间:2015-06-26 20:37:05

标签: java generics comparable

我想正确设置Comparable对象的类型。我有以下方法:

abstract <T> boolean check( Comparable<T> first, T second );

目前,参数first和second声明如下:

 Comparable first = convertStringValueToType(attribute.getValue(), attribute.getType());
 Comparable second = convertStringValueToType(expectedValue.getFirst(), attribute.getType());

方法convertStringValueToType()返回String,BigDecimal或Boolean。不幸的是,我不能只使用attribute.getType(),因为它返回另一个对象(DataElementAttributeType)。

认为 first应该是Comparable<?> first,因为我们不知道我们会得到什么类型。但是,如果我将其设为Comparable<?>,则表示second也应为?。我不确定如何使second成为?类型,因为?不是类型。

是否可以解决此问题?

使用firstsecond内对

编辑 check()first.compareTo(second)进行了比较。我们将始终比较相同的类型(String to String,boolean to boolean等),因为second是从配置文件中给出的。

2 个答案:

答案 0 :(得分:0)

不可能以类型安全的方式执行此操作,因为仅仅因为两个对象都是Comparable s并不意味着它们可以相互比较。您正在获取的对象可能是几种不同的Comparable类型之一(并且您只能在运行时知道哪些类型),并且它们可以比较的内容没有共性;例如String只能与String进行比较,而BigDecimal只能与BigDecimal进行比较,所以您可以说的是该对象可以与&#34;某些& #34; (即Comparable<?>),这对于编译时类型检查来说是完全无用的。

通过运行.compareTo()并查看它是否在运行时生成ClassCastException,您只能知道是否可以与另一个进行比较。

答案 1 :(得分:-1)

为此你必须扩展Comparable

    String x = "sdf", x2 = "sdf";
    int y = 55, y2 = 56;
    Boolean ob = true, ob2 = false;
    Compare compare = new Compare();
    compare.check(y2, y2);
    compare.check(ob, ob2);
    compare.check(x, x);

//For your case it will be
  Compare compare = new Compare();
  compare.check(convertStringValueToType(attribute.getValue(), attribute.getType()), convertStringValueToType(expectedValue.getFirst(), attribute.getType()));

class Compare<T extends Comparable> {

int check(T first, T second) {
    return first.compareTo(second);
}
}