有接口参数时是否可以自动选择适当的 class 方法?

Is it possible to automatically chose the appropriated class method when having an interface argument?

好的,我已经搜索过了,但找不到这个特定问题的答案。这可能是一个反复出现的问题,我不知道正确的术语来指代它,所以感谢所有帮助。 :)

假设我们有一个方法 m0,它从接口 I 接收一个对象,即对象 i。

Class A 和 B 扩展接口 I,因此对象 i 可以是 class A 或 B。

然后,在方法 m1 中,我想使用接口 I 中声明的方法 mi,它接收接口 I 的参数。

在 Classes A 和 B 中,我实现了 mi,我希望 mi 根据参数运行。如果 mi 接收到 class A 的对象,我希望它使用来自 class A 的 mi 实现,否则,我想要来自 class B 的实现。我不想如果对象是 A 或 B 的实例,请检查方法 m0,因为我希望该方法是独立的并且仅依赖于接口 I。有机会我想引入更多 classes 扩展一.

public boolean m0(I i1, I i2){
   return i1.mi(i2);
}

public interface I{
   public boolean mi(I i);
}

class A implements I{

   boolean boolValue;
   ...
   mi(I i){
     if(this.boolValue == i.boolValue)
        return true;
     return false;
   }
}

class B implements I{

   int intValue;
   ...
   mi(I i){
      if(this.intValue == i.intValue)
         return true;
      return false;
   }
}

想法是 class A 和 B 在本质上是不同的,但我希望它们具有共同的 mi 方法。所以 i1.mi(i2) 应该根据参数 i2 进行调整。保证 i1 和 i2 在 m0 中总是相同的 class。然而,在两个 classes 的 m0 方法实现中,我不允许访问第 i 个对象属性 booleanValue 或 intValue(取决于参数类型)。

我已经编辑了问题,因为我没有正确解释问题,无论如何感谢你到目前为止的回答。

谢谢

编辑:此问题已解决。要实现我正在寻找的那种行为,可以使用通用类型。 https://docs.oracle.com/javase/tutorial/java/generics/types.html

你似乎把事情复杂化了很多。您的实现应该 return 您想要的值,仅此而已,并且不需要指向自身的指针,因为您可以使用它。

public boolean m0(I i){
   return i.mi();
}

public interface I{
   public boolean mi();
}

class A implements I{

   boolean a = true;

   mi(){
      return this.a;
   }
}

class B implements I{

   boolean b = false;

   mi(){
      return this.b;
   }
}

当然,在您的精确示例中,您可以对方法中的值进行硬编码:

class A implements I{

   boolean mi(){
      return true;
   }
}

注意:您需要使用 implements 而不是 extends 因为 I 是一个接口。

编辑: 你已经澄清了这个问题。我不太确定你是如何得出这样一个设计的,所以也许你应该回顾一下你的整个设计,但鉴于你的问题,这就是你如何实现它的。基本上在您的界面上添加一个泛型类型,以便您的界面充当此类型的包装器。 该代码可能比任何冗长的解释都更容易理解:

public <T> boolean m0(I<T> i1, I<T> i2){
   return i1.mi(i2.getT());
}

public interface I<T>{
   public T getT(); 

   public boolean mi(T i);
}

class A implements I<A>{

   boolean boolValue;

   public A getT() {
        return this;
    }

   public boolean mi(A i){
     if(this.boolValue == i.boolValue)
        return true;
     return false;
   }
}

class B implements I<B>{

   int intValue;

   public B getT() {
        return this;
    }


   public boolean mi(B i){
      if(this.intValue == i.intValue)
         return true;
      return false;
   }
} 

所以你的 类 都定义了 return 本身的 getT(),以及采用确切子类的方法 mi。编译器还保证您只能调用具有匹配类型的 m0。

布尔变量没有在接口中声明,所以你不能那样做。 return this.a 或 this.b 在方法 mi 中(以上答案)或将布尔值放入接口:

public boolean m0(I i){
   return i.mi();
}

public interface I{
   boolean a;
   public boolean mi();
}

class A implements I{
   public A(){
   a = true;
}
   mi(){
      return this.a;
   }
}

class B implements I{

     public B(){
     a = false;
}
   mi(){
      return this.a;
   }
}

假设,您有如下函数 m0 并且方法 mi() 在实现接口 I

的 class A 和 B 中实现
public boolean m0(I i){
   return i.mi()
}

如果你实例化为,

I val1 = new A()
val1.mi() 

将调用在 class A

中实现的方法

如果你实例化为,

I val2 = new B()
val2.mi() 

将调用在 class B

中实现的方法

就这么简单。 你没有。你的代码有很多错误。但我认为这个答案解决了你的问题。