有没有办法在java中实现'抽象类方法'?

时间:2014-09-30 08:06:35

标签: java

更新: 我知道静态方法不是抽象的,我知道为什么,而且它不是一个像是否可能的问题?'或者'为什么它不可能?',我只是想知道是否有任何方法可以得到我想要的东西。

好吧,如果你在python中听说过 @classmethod ,你可以跳过其余部分。

这就是我想要的:在某些情况下,某些方法只是功能,我只需要它的功能。但是,在Java中,您必须将所有内容放在一个类中,因此我必须将这些函数包装在一个类中并将它们设置为静态。问题是,对于像这样的课程,我不会,我不应该需要任何实例。同时,我想要像这样的类的一些层次结构。这里的层次结构就像一些“控制”一样:我可以控制你应该做的事情的子类,也就是你应该拥有的方法/功能。


众所周知,我们无法在类中声明static abstract方法。

但是,有些情况下您只需要方法而不是实例,并且您需要该方法是抽象的并在子类中实现它。

有些人指出this may be a poor design in java,但是有没有可能的解决办法呢?

3 个答案:

答案 0 :(得分:2)

不,你不能 主要是因为'摘要'和静态'方法相互矛盾。 详见这里的解释: Why can't static methods be abstract in Java

答案 1 :(得分:1)

您的静态方法不能是抽象的,但您可以使用功能界面,FunctionBiFunction或甚至Consumer等预定义的方法最有可能满足您的所有需求。预定义的接口:http://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html

如果这些不符合您的要求,您可以write your own interfaces,因此能够传递任意方法参考...确保始终检查为空,尽管

答案 2 :(得分:0)

静态方法不能声明为abstract,因为重写(子类型多态)不适用于静态方法。如果需要解决方法,请执行以下操作:

public void myMainFunction() {
    ArrayList<Animal> animals = new ArrayList<Animal>();
    animals.add(AnimalFactory.createAnimal(Bird.class,birdXML));
    animals.add(AnimalFactory.createAnimal(Dog.class,dogXML));
}

public abstract class Animal {
    /**
     * Every animal subclass must be able to be created from XML when required
     * (E.g. if there is a tag <bird></bird>, bird would call its 'createFromXML' method
     */
    public abstract Animal createFromXML(String XML);
}

public class Bird extends Animal {
    @Override
    public Bird createFromXML(String XML) {
    // Implementation of how a bird is created with XML
    }
} 

public class Dog extends Animal {
    @Override
    public Dog createFromXML(String XML) {
    // Implementation of how a dog is created with XML
    }
}

public class AnimalFactory{
    public static <T extends Animal> Animal createAnimal(Class<T> animalClass, String xml) {
      // Here check class and create instance appropriately and call createFromXml
      // and return the cat or dog
    }
}

我从这里得到它:Static abstract method workaround