正确分配泛型变量
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
成为 ?
类型,因为 ?
不是类型。
这个问题可以解决吗?
编辑: first
和 second
在 check()
中使用 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);
}
}
不可能以类型安全的方式执行此操作,因为仅仅因为两个对象都是 Comparable
s 并不意味着它们可以相互比较。您得到的对象可能是几种不同 Comparable
类型之一(您只会在运行时知道是哪一种),并且它们可以比较的对象没有共同点;例如String
只能与 String
进行比较,而 BigDecimal
只能与 BigDecimal
进行比较,所以你只能说该对象可以与 "something" 进行比较(即 Comparable<?>
),这对于编译时类型检查是完全无用的。
你只能通过 运行 .compareTo()
并查看它是否在运行时产生 ClassCastException
来知道一个是否可以与另一个进行比较。
我想正确设置 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
成为 ?
类型,因为 ?
不是类型。
这个问题可以解决吗?
编辑: first
和 second
在 check()
中使用 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);
}
}
不可能以类型安全的方式执行此操作,因为仅仅因为两个对象都是 Comparable
s 并不意味着它们可以相互比较。您得到的对象可能是几种不同 Comparable
类型之一(您只会在运行时知道是哪一种),并且它们可以比较的对象没有共同点;例如String
只能与 String
进行比较,而 BigDecimal
只能与 BigDecimal
进行比较,所以你只能说该对象可以与 "something" 进行比较(即 Comparable<?>
),这对于编译时类型检查是完全无用的。
你只能通过 运行 .compareTo()
并查看它是否在运行时产生 ClassCastException
来知道一个是否可以与另一个进行比较。