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数据的方法,以便我可以抽象出一些东西。我该怎么办?
答案 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检索列表中的每个元素。