Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用实现接口的抽象类(Java)_Java_Interface_Abstract Class_Implements - Fatal编程技术网

使用实现接口的抽象类(Java)

使用实现接口的抽象类(Java),java,interface,abstract-class,implements,Java,Interface,Abstract Class,Implements,我有这个界面, 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 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() {}
}
在我的代码中的某个地方,我想调用一个函数doSomething(类AbstractClass),该函数根据类AbstractClass的类型执行
m1()
m3()

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

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

doSomething(AbstractThing1.class);
private void doSomething(T类抽象类){
...
kindOfAbstractClass.m1();
kindOfAbstractClass.m3();
...
}
doSomething(抽象事物1.class);
试试这个:

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

您的问题是,您提供的是类类型而不是实例作为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{

}
公共类MyClass{
void doIt(){
doSomething(新事物);
}
私人无效剂量(T类抽象类){
kindOfAbstractClass.m1();
kindOfAbstractClass.m3();
}
}
接口和所有内容{
空m1();
空隙m3();
}
抽象类AbstractThing1实现IAnything{
公共无效m1(){}
公共void m3(){}
}
类ConcreteThing扩展了AbstractThing1{
}

似乎只有呼叫
做了不正确的事情。不要传递
,而是传递两个类之一的实例。但如果这些类是抽象的,我没有任何实例。是的,请阅读@gheese答案,您需要一个实例才能使用
doSomething
。我假设你的代码中有一个。谢谢。但我应该这样称呼它吗?doSomething(抽象事物1.class);我在那里遇到了错误。您必须将和实例传递给doSomething方法,但抽象类不能直接实例化,因此您必须扩展抽象类以实现其抽象方法,然后将创建的新类的实例传递给doSomething。