你能在Java中使用多类型变量声明吗?

时间:2013-04-13 08:50:31

标签: java variables types declaration

我有多个接口和一个实现所有接口的类。我想在实现类的实例上调用这些接口中定义的所有方法,但我不想将类变量声明为类,因此我仍在编程接口。

似乎我要么:

  1. 将对象从一种接口类型转换为另一种接口,以调用适当的方法。
  2. 创建一个联合接口,扩展其他接口并声明该类型的变量。
  3. 我宁愿不做其中任何一个,因为1不是类型安全的,2可能意味着你很快会得到很多'联合'接口,这些接口本身不会增加任何东西。有可能有类似的东西:

    public interface A {
        public void doThis();
    }
    
    public interface B {
        public void doThat();
    }
    
    public class C implements A, B {
        public void doThis(){;}
        public void doThat(){;}
    }
    
    
    //Fake calling code:
    public void go() {
        A,B dualTypedInstance = new C(); //
        dualTypedInstance.doThis();
        dualTypedInstance.doThat();
    
    }
    

    看起来这应该是可能的。感谢。

6 个答案:

答案 0 :(得分:2)

你可以这样做:

ImplementsInterfaces impl = new ImplementsInterfaces();
A a = impl;
B b = impl;

答案 1 :(得分:0)

为什么不想实例化实现(a)和(b)的类(c)?

另一种方法是从(a)和(b)创建抽象类,并有两个抽象方法(每个都有一个),然后创建类(c)然后扩展(而不是实现)其他类。

答案 2 :(得分:0)

另一种选择是创建抽象超类:

public abstract class AbstractAB implements A, B {
}

public class C extends AbstractAB {
    public void doThis(){;}
    public void doThat(){;}

}

public void go() {
    AbstractAB dualTypedInstance = new C();
    dualTypedInstance.doThis();
    dualTypedInstance.doThat();
}

答案 3 :(得分:0)

虽然我并不一定会在生产代码中推荐该解决方案,但在2019年做到这一点并不是完全不可能的,它还带有一个警告,即对象必须是不可变的。例如,要创建一个有效有效的类,该类具有一个实现InterfaceA和InterfaceB的实例变量,它们分别具有方法methodA()和methodB(),则可以执行类似

的操作
public interface MyInterface {
  public void methodA();
  public void methodB();

  public static <O extends InterfaceA & InterfaceB> MyInterface of(O obj){
      return new MyInterface(){
          public void methodA(){
               obj.methodA();
          }

          public void methodB(){
               obj.methodB();
          }
      };
  }

这将创建一个匿名内部类,该内部类实际上具有类型为InterfaceA和InterfaceB的最终实例变量,而无需对该依赖项进行任何特定的实现。

答案 4 :(得分:0)

您也可以在Class声明中这样做:

public class<T extends A & B> SomeClass{
     Void doStuff(){
          T variable = new C();
     }
}

答案 5 :(得分:-1)

接口包含一个不同的抽象单元,以便它们可以单独使用,即不知道它们的实现,也不依赖于可能在类中实现的其他接口。接口可以扩展其他接口,但层次结构本身不是一个东西,它应该在您的应用程序中具有一些含义。所以,如果你被迫制作许多人工“标记”界面,那么你做错了什么的可能性很高。最后但并非最不重要的是,您可以拥有一个可以实现必要接口的抽象基类。

让我用一个简单的例子来说明这一点。假设您正在为应用程序创建前端。您可以考虑可以拖动或可实现的不同面板。用java术语表示,可以有两个接口:Draggable带有drag()方法,Resizable带有redize()方法。在拖动事件下,您的API不应该知道实现类的详细信息,它应该关注的唯一事情是,此类是否实现Draggable。但是你希望有一个具体的实现,其中两个接口以可能不同的方式实现,你可以创建一个抽象类作为具体实现的基础:abstract class BasePanel extends Panel implements Draggable, Resizable。这样,您就可以在单独的“拖动”和“调整大小”上下文中隐藏的方式声明您的类。另一方面,如果你想拥有一个能够识别它们的上下文,你可以创建另一个扩展两个基本接口的接口,并可能添加另一个方法,如public interface GuiUnit extends Draggable, Resizable

最后,我的想法是向您展示,当您期望在不相关的接口之间进行条件转换时,应该避免设计情况,并且要么将实现基于您期望处理的一个接口,要么基于某些抽象类。如果您认为这还不够 - 那么您最好重新考虑您的设计考虑因素。