我想正确设置 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
类型为 ?
作为?
不是类型。
是否可以解决此问题?
编辑: first
和 second
比较里面check()
使用 first.compareTo(second)
.我们将始终比较与 second
相同的类型(字符串到字符串、 boolean 值到 boolean 值等)。从配置文件中给出。
最佳答案
不可能以类型安全的方式执行此操作,因为仅仅因为两个对象都是 Comparable
s并不意味着他们可以相互比较。您得到的对象可能是几个不同的对象之一 Comparable
类型(你只会在运行时知道是哪个),并且它们可以比较的东西没有共同点;例如String
只能比较String
s,而 BigDecimal
只能比较BigDecimal
s,所以你只能说对象可以与“某物”(即 Comparable<?>
)进行比较,这对于编译时类型检查目的来说是完全无用的。
您只能通过运行 .compareTo()
来了解一个是否可以与另一个进行比较看看它是否产生 ClassCastException
在运行时。
关于java - 正确分配泛型变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31081751/