我想正确设置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)
进行了比较。我们将始终比较相同的类型(String to String,boolean to boolean等),因为second
是从配置文件中给出的。
答案 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);
}
}