如何将一种类型的对象(接口)转换为另一种(接口)?

时间:2014-06-03 05:39:09

标签: java interface

我有一个接口Interface1,它已经由A类实现并且有一些私有变量值设置,并且m将类A的对象发送到接受输入为Interface2的下一个类。那么如何将这个对象转换为Interface1到Interface2?

interface Interface1{}
interface Interface2{}

class A implements Interface1 {
    private int id;

    public void setId(int id)
    {
        this.id = id;
    }
}

class B {
    Interface1 call(Interface1 i)
    {
        C c = new C();
        c.call2(i); //this should be of type Interface2 so how to do this
        return i;
    }

    public static void main(String arg[])
    {
        Interface1 i = new A();
        i.setId(5);
        B b = new B();
        b.call(i);
    }
}

class c {
    Interface2 call2(Interface2 i)
    {
        return i;
    }
}

5 个答案:

答案 0 :(得分:1)

鉴于Interface1Interface2是两个完全不相关的接口,假设A实例能够用作Interface2怎么办? A甚至可能没有定义Interface2个方法。

有几种方法可以做到更合适的设计。

首先,如果你想将Interface1和2保持为两个不相关的接口,你应该让A实现它们:

class A implements Interface1, Interface2 {

至少你可以在B#call()

中为此做一些演员
if (i instanceof Interface2) {
    Interface2 i2 = (Interface2) i;
    ....
    c.call2(i2);
}

如果在您的设计中使Interface1和2具有继承关系是合适的,那么故事可能会更容易:

interface Interface1 extends Interface2 {

然后Interface1可以直接用作Interface2。

另一种可能性是,如果您知道,通过Interface1提供的任何内容,它可以某种方式用作Interface2(例如,某种程度上像Java的Runnable和Callable),您可以为Interface1编写一个Interface2适配器: / p>

class Interface1I2Adapter implements Interface2 {
    Interface1 i1;
    public Interface1I2Adapter (Interface1 i1) {
         this.i1 = i1;
    }
    // impl of Interface2 methods by delegating to i1
}

然后你可以使用

c.call2(new Interface1I2Adapter(i));

类似的东西。

如果没有关于您的设计的更多信息,则无法确定您的正确方法。以下是一些适用于很多情况的建议。

答案 1 :(得分:0)

如下所示?

 class D implements Interface2{}

C c = new C();
D d = new D();
d.set...(i.get...());
c.call2(d);

答案 2 :(得分:0)

您无法从一个界面转换到另一个界面,因为它们是独立的抽象。或者,您可以通过将Interface1作为Interface2的子类来实现此目的。您应该按如下方式扩展Interface2并使用它:

  interface Interface1 extends Interface2{  
      void setId(int id);
  }

答案 3 :(得分:0)

Interface1应扩展Interface2,以便将Interface1引用传递给Interface2。

正确的代码 -

interface Interface1 extends Interface2 { //Imp



}

interface Interface2  {
public void setId(int id);
}

class A implements Interface1 {
private int id;

public void setId(int id) {
    this.id = id;
}
}

public class B {
Interface1 call(Interface1 i) {
    C c = new C();
    c.call2(i); // this should be of type Interface2 so how to do this
    return i;
}

public static void main(String arg[]) {
    Interface1 i = new A();
    i.setId(5);
    B b = new B();
    b.call(i);
}
 }

class C {
Interface2 call2(Interface2 i) {
    return i;
}
}

答案 4 :(得分:0)

此类问题通常通过Composition解决。

要编写现有接口,您需要编写一个实现Interface2的类,并委托给Interface1的内部实例。

Go4 Adapter Pattern进一步表达了这一想法。