我有一个接口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;
}
}
答案 0 :(得分:1)
鉴于Interface1
和Interface2
是两个完全不相关的接口,假设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进一步表达了这一想法。