【问题标题】:Using abstract class that implements an interface (Java)使用实现接口的抽象类(Java)
【发布时间】:2013-01-30 07:23:20
【问题描述】:

我有这个界面,

public interface IAnything {
  void m1();
  void m3();
}

以及实现这个接口的两个抽象类:

public abstract class AbstractThing1 implements IAnything {
  public void m1() {}
  public void m3() {}
}

public abstract class AbstractThing2 implements IAnything {
  public void m1() {}
  public void m3() {}
}

在我的代码中的某个地方,我想调用一个 function doSomething(kindOfAbstractClass) 来执行 m1()m3(),以及其他取决于 kindOfAbstractClass 的工作。

如何定义和调用doSomething()?我这样做了,但它不起作用。谢谢

private <T extends IAnything> void doSomething(T kindOfAbstractClass) {
...
kindOfAbstractClass.m1();
kindOfAbstractClass.m3();
...
}

doSomething(AbstractThing1.class);

【问题讨论】:

  • 似乎只有调用 doSomething 不正确。不要传递Class,而是传递两个类之一的实例。
  • 但是这些类是抽象的,我没有任何实例。
  • 是的,阅读@gheese 答案,您需要一个能够使用doSomething 的实例。我假设您在代码中的某个位置有一个。

标签: java interface abstract-class implements


【解决方案1】:

您的问题是您提供的是类类型而不是实例作为 doSomething 的参数

看看下面修改后的代码:

public class MyClass {


    void doIt(){
        doSomething(new ConcreteThing());       
    }

    private <T extends IAnything> void doSomething(T kindOfAbstractClass) {

            kindOfAbstractClass.m1();
            kindOfAbstractClass.m3();
    }

}


interface IAnything {
      void m1();
      void m3();
}

abstract class AbstractThing1 implements IAnything {
      public void m1() {}
      public void m3() {}
}


class ConcreteThing extends AbstractThing1{

}

【讨论】:

    【解决方案2】:

    试试这个:

    private void doSomething(IAnything  kindOfAbstractClass) {
    ...
    kindOfAbstractClass.m1();
    kindOfAbstractClass.m3();
    ...
    }
    

    【讨论】:

    • 谢谢。但我应该这样称呼它吗? doSomething(AbstractThing1.class);我在那里遇到错误。
    • 您必须将实例传递给 doSomething 方法,但抽象类不能直接实例化,因此您必须扩展抽象类以实现其抽象方法,然后将实例传递给 doSomething创建了新的类。
    猜你喜欢
    • 2012-01-20
    • 2014-08-18
    • 2014-02-05
    • 2020-10-20
    • 2012-07-17
    • 2011-11-20
    • 2011-10-18
    • 1970-01-01
    • 2015-04-02
    相关资源
    最近更新 更多