【问题标题】:Testing if two Java Objects can be compared to each other测试两个 Java 对象是否可以相互比较
【发布时间】:2017-02-06 04:13:25
【问题描述】:

我在 Java 中有两个值,可以是任何类型(基元除外),所以它们都是 Object 类型。我想看看有没有实现 Comparable,如果有,调用 compareTo() 方法比较。

但是,因为 Comparable 是一个泛型接口,所以两个 Object 可以实现,例如 Comparable 和 Comparable,并且不能相互比较。

有什么方法可以判断两个Object是否可以相互比较?

当我考虑到这一点时,我意识到可能有更好的方法来做到这一点,它涉及使用 Object 以外的其他类型,但在这一点上,我只是对我提出的问题感到好奇。

【问题讨论】:

  • 您的问题实际上可能是XY Problem,当最好的解决方案是完全使用不同的方法时,您会问“我该如何解决这个代码问题”。考虑告诉我们您正在尝试解决的整体问题,而不是您当前尝试解决的方式。我的猜测是,在后台潜伏着一两个设计模式只是想被使用。
  • @HovercraftFullOfEels 是的,确实如此,所以这个问题现在更多是关于空闲的好奇心,而不是使用此代码的实际意图。我目前正在寻找更好的解决方案来解决这个问题,如果没有成功,我会发布另一个问题,提供更多详细信息。

标签: java generics polymorphism comparable


【解决方案1】:

通过反射,您可以找到 Comparable 接口的泛型类型。

其他惰性选项是调用它并捕获 ClassCastException :)

【讨论】:

  • "通过反射可以找到 Comparable 接口的泛型。"我认为您的意思是通过其中一个类的继承层次结构找到它实现Comparable 的类型参数,然后使用它来检查另一个对象。这只有在Comparable 接口的类型参数是具体的可具体化类型时才有效。如果类型参数是参数化类型或类型变量,则无法在运行时检查对象。
  • 当然有限制,但由于操作只是好奇...... Comparable 不应该经常使用参数化类型实现,因为这通常会产生奇怪的副作用(有点像制作等号( ) 不拒绝子类...)
【解决方案2】:

你可以做的是:

  • 您可以使用Class.isAssignableFrom() 来确定您的两个对象 X 和 Y 是否属于“兼容”类
  • 然后您可以检查它们是否真的实现了 Comparable 接口

然后假设在两个对象之一上调用该方法实际上会产生合理的结果。

但老实说,我支持 cmets:这听起来是一个奇怪的想法; 感觉你最好退后一步,寻找更好的方法来解决你的真正问题。试图找到比较苹果和石头的“通用”方法并不容易。

【讨论】:

    猜你喜欢
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    相关资源
    最近更新 更多