正确分配泛型变量

Correctly Assigning Variables of a Generic Type

我想正确设置 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() returns String、BigDecimal 或 Boolean。不幸的是,我不能只使用 attribute.getType() 作为 returns 另一个对象 (DataElementAttributeType)。

认为 first 应该是 Comparable<?> first 因为我们不知道我们会得到什么类型。但是,如果我做到 Comparable<?> 那么这意味着 second 也应该是 ?。我不确定如何使 second 成为 ? 类型,因为 ? 不是类型。

这个问题可以解决吗?

编辑: firstsecondcheck() 中使用 first.compareTo(second) 进行比较。我们将始终比较相同的类型(字符串到字符串、布尔值到布尔值等),因为 second 从配置文件中给出。

为此,您必须扩展 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);
}
}

不可能以类型安全的方式执行此操作,因为仅仅因为两个对象都是 Comparables 并不意味着它们可以相互比较。您得到的对象可能是几种不同 Comparable 类型之一(您只会在运行时知道是哪一种),并且它们可以比较的对象没有共同点;例如String 只能与 String 进行比较,而 BigDecimal 只能与 BigDecimal 进行比较,所以你只能说该对象可以与 "something" 进行比较(即 Comparable<?>),这对于编译时类型检查是完全无用的。

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