不同参数Java的抽象方法

Des*_*ond 5 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
      }
    }
Run Code Online (Sandbox Code Playgroud)

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

Ell*_*sch 8

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

public abstract class CommonClass<T> {
    abstract void send(List<T> al);
}   
Run Code Online (Sandbox Code Playgroud)

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

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
    }
}
Run Code Online (Sandbox Code Playgroud)

另外,如评论中所述,您的类名称可以进行改进以更加直观;就像是,

public abstract class AbstractSender<T> {
    abstract void send(List<T> al);
}
Run Code Online (Sandbox Code Playgroud)

然后

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
    }
}
Run Code Online (Sandbox Code Playgroud)

这样做的优点是可读性更高,并且更容易推理(我可以PostSender通过读取名称来告诉a 做什么,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
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @Desmond您是否将T定义为CommonClass中的类型参数,并且您在从CommonClass继承的类中定义了T必须是什么?(仔细检查以上答案) (2认同)
  • @Desmond您设置了什么Java编译器级别?泛型要求Java 5+(于2004年发布)。另外,您是否按照我的回答使用了“完全”代码? (2认同)