java - 正确分配泛型变量

标签 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) .我们将始终比较与 second 相同的类型(字符串到字符串、 boolean 值到 boolean 值等)。从配置文件中给出。

最佳答案

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

您只能通过运行 .compareTo() 来了解一个是否可以与另一个进行比较看看它是否产生 ClassCastException在运行时。

关于java - 正确分配泛型变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31081751/

相关文章:

java - 按多个变量对 List 进行排序的 compareTo 方法逻辑

java - 错误 java.lang.reflect.InitationTargetException

java - CompletableFuture.allOf().orTimeout() 的意外行为

windows - Windows 上的 Eclipse 无法启动

java - 根据字段与字符串列表的比较对对象列表进行排序

java - 不能使用 comparable with father-son-grandson inheritance

generics - 为什么不能将 `&(?Sized + Trait)` 转换为 `&dyn Trait` ?

Java泛型类和非泛型类

android - 获取用于解析嵌套的 Parcelable 泛型字段的泛型类加载器

java - Collections.sort 在重写compare 和compareTo 后不起作用