Java:等于检查接口而不是类

时间:2011-01-19 14:20:39

标签: java interface equals

我有一个案例,我有一个代表实体的Java接口。该接口在2个不同的类中实现。 因此,我需要一种测试方法 - 如果2个类有一个共同的接口 - 如果这两个类的所有Getter-Values都相同

如果两者都是真的,那么在我需要的情况下,它们会相等。 (注意,我不知道他们实现了哪个界面,有一些可能)

这是否可行,或者我是否需要提供接口,然后检查这两个类是否实现了它?

感谢您的帮助, 迈克尔

5 个答案:

答案 0 :(得分:5)

注意:如果一个类有不同的接口,那么这可能会破坏约束:

  

equals方法实现了一个   非空的等价关系   对象引用:

     
      
  • 它是自反的:对于任何非空引用值x,x.equals(x)应该是   返回true。
  •   
  • 它是对称的:对于任何非空参考值x和y,x.equals(y)   应该返回true,当且仅当   y.equals(x)返回true。
  •   
  • 它是传递性的:对于任何非空参考值x,y和z,if   x.equals(y)返回true和   y.equals(z)返回true,然后   x.equals(z)应该返回true。
  •   
  • 一致:对于任何非空引用值x和y,为多个   调用x.equals(y)   一贯回归真实或   如果没有,则一直返回虚假   用于等比较的信息   在对象上进行了修改。
  •   

@see:Object.equals的java doc

如果你有三个类A,B,C树Itnerfaces I1,I2,I3:

  • 一个implments接口I1和I2,
  • B implments I2和I3
  • C implments I1和I3。

然后你可能会遇到这种情况:

  • A因B2而等于B
  • 由于I3 ,
  • B等于C.
  • 但是:由于I3
  • ,A不等于C.

这会违反传递约束!这可能导致很难找到错误!

这只是一个警告,在您开始将其声明为主要架构风格之前要三思。

<强>加了:

相反,我建议实现与比较器类似的东西,但不要进行比较,但要检查“等于”,其含义类似于“等于X”(其中X是例如你的一个)接口)

答案 1 :(得分:1)

java.lang.Class有一个名为getInterfaces的方法,它允许您获取对象实现的接口。您可以获取要比较的对象的接口列表,然后进行比较。

Class<?>[] interfaces1 = obj1.getClass().getInterfaces();
Class<??[] interfaces2 = obj2.getClass().getInterfaces();
// iterate through the arrays to figure out which interfaces are common across the objects

然后对于常见的,使用反射列出吸气剂并比较吸气剂的值。

一般来说,假设您只有X个接口的实现并不是一个好的假设,因为接口背后的想法是您并不真正关心底层实现。

答案 2 :(得分:0)

 if ( oneClass instanceof Interface1 && secondClass instanceof Interface2)

有一种名为isAssignableFrom

的方法

Class.isAssignableFrom(界面);

答案 3 :(得分:0)

你需要自己写这个,但这不应该太糟糕。你需要使用反射。

首先,您需要每个对象的Class。使用Object#getClass()获取课程。

其次,使用Class[] Class#getInterfaces()获取两个类的接口并查找匹配项。

然后,如果找到匹配项,请使用Method[] Class#getMethods()查找它们共有的接口的所有方法。

对于这些方法中的每一种,使用Method#getName()查看它们是以“get”开头还是Method#getParameterTypes()来获取方法的参数类型。对于典型的“getter”,它将有0个参数。

然后,要执行这些方法,请为每个对象调用Method#invoke(Object)。这将调用该方法并返回该getter的值。然后,您可以比较这些值并确保它们匹配。

答案 4 :(得分:-2)

如果您无法知道对象可能正在实现哪个接口,我建议您创建一个伞形接口。

public interface MyGeneralInterface {}
public interface SpecificInterface1 implements MyGeneralInterface {}
public interface SpecificInterface2 implements MyGeneralInterface {}
public class SpecificClass1 implements SpecificInterface1 {}
public class SpecificClass2 implements SpecificInterface2 {}

然后正如Jigar所说,使用instanceof

if(myobj instanceof MyGeneralInterface) {}