不同参数Java的抽象方法

时间:2019-08-23 06:46:46

标签: java generics

public abstract class CommonClass {

      abstract void send(<what should i put here???>) {}
    }   

 public class ClassA extends CommonClass {

      void send(List<Comments> commentsList) {
            // do stuff
      }
    }

 public class ClassB extends CommonClass {

      void send(List<Post> postList) {
            // do stuff
      }
    }

我是OODP的新手,我正在尝试一种能够接收任何种类的List数据的方法,以便我可以抽象出一些东西。我该怎么办?

3 个答案:

答案 0 :(得分:8)

您可以使其在某些类型T上通用。喜欢,

public abstract class CommonClass<T> {
    abstract void send(List<T> al);
}   

然后,要实现它-使用泛型。喜欢,

public class ClassA extends CommonClass<Comments> {
    @Override
    void send(List<Comments> commentsList) {
        // do stuff
    }
}

public class ClassB extends CommonClass<Post> {
    @Override
    void send(List<Post> postList) {
        // do stuff
    }
}

此外,如注释中所述,您的班级名称可以进行改进以更加直观;像

public abstract class AbstractSender<T> {
    abstract void send(List<T> al);
}

然后

public class CommentSender extends AbstractSender<Comment> {
    @Override
    void send(List<Comment> commentsList) {
        // do stuff
    }
}

public class PostSender extends AbstractSender<Post> {
    @Override
    void send(List<Post> postList) {
        // do stuff
    }
}

这样做的优点是可读性更高,并且更容易推理(我可以通过读名字PostSender来告诉ClassB做什么)。

最后,这似乎是一个接口可以工作的情况,因为您的abstract class是纯虚拟的(并且应该首选,因为您可以实现多个接口,但是只能从一个接口扩展单亲课程);

public interface ISender<T> {
   void send(List<T> al);
}

public class CommentSender implements ISender<Comment> {
    @Override
    void send(List<Comment> commentsList) {
        // do stuff
    }
}

public class PostSender implements ISender<Post> {
    @Override
    void send(List<Post> postList) {
        // do stuff
    }
}

答案 1 :(得分:1)

为了实现这一目标,您可以采用多种方法,我建议您研究泛型:https://docs.oracle.com/javase/tutorial/java/generics/index.html

话虽如此,但有一种方法是最优雅,最简单的:您可以提供List<T>,其中T是通用类型。

public abstract class CommonClass<T> {

      abstract void send(List<T>) {}

}   

 public class ClassA extends CommonClass<Comment> {

      void send(List<Comments> commentsList) {
            // do stuff
      }
}

 public class ClassB extends CommonClass<Post> {

      void send(List<Post> postList) {
            // do stuff
      }
}

答案 2 :(得分:0)

您可以在泛型的帮助下完成此操作。 https://www.tutorialspoint.com/java/java_generics.htm


示例

抽象类

public abstract class CommonClass {
    public abstract <T> void send(List<T> data);
}

它的孩子

public class Child extends CommonClass {

    public <T> void send(List<T> data) {
        // code here
    }
}

获取列表内容

检索已生成列表的内容类似于检索任何列表的内容。在该方法的范围内,“ T”是列表中包含的一种对象。

for (T t : data) {
    // to check if t is a string
    if (t instanceof String) {
        // code
    }
}

您还可以使用lambda检索列表中的每个元素。