我还没有找到解决这个问题的优雅方法。我有一个抽象类,其他几个类继承了一个抽象方法,该方法可以包含从零到 4-5 个不同类型的参数。
public abstract class Item {
public abstract void use();
}
例如,我有一个 Book 类继承了它并且在覆盖 use() 时不带任何参数,我有一个 Key 类继承并在覆盖时带一个 String 和 Queue 作为参数,等等......
我试过使用泛型,但我必须输入使用的数字,例如 Item,而它实际上取决于类。
public abstract class Item<T,U> {
public abstract void use(T arg1, U arg2); //Number of arguments/types could be more or less
}
我试过发送对象的可变列表,但对象类型总是可变的,我不确定在继承类中接收的语法。
public abstract class Item<T> {
public abstract void use(T... arguments);
}
public class Book extends Item<?> {
public void use(?);
}
public class Book extends Item<String, Queue> { //Wrong number of arguments since I can't use Item<T...>
public void use(String str, Queue q); //fails
}
我可能只是做错了什么 - 谁能提供任何帮助或见解?
最佳答案
我一直在为同样的问题苦苦挣扎,没有一个完美的答案,但我可以给你一些要考虑的事情。首先,您基本上是在尝试做一些本质上违背面向对象编程的事情,即您在尝试创建一个可变接口(interface)。接口(interface)的要点是获取对象抽象版本(例如,Item 而不是 Book)的代码知道如何调用 use() 方法。这意味着他们必须知道什么可以传递给 use() 方法。如果答案取决于抽象类或接口(interface)的实现,那么您需要确保使用它的代码确实知道它使用的是哪种实现(Book 等),否则它不会知道如何调用 use () 无论如何都带有适当的参数。老实说,听起来您需要重构代码。
但是,有一种方法可以在不重构架构的情况下回答您的问题。您可以创建一个类,其数据是可能传递给 use() 方法的所有不同类型的参数,让调用代码设置该类的字段,然后将其传递给 use() 方法。例如:
public class UseParameters {
private String string;
private Queue queue;
// Any other potential parameters to use(...)
public void setString(String string) {
this.string = string;
}
public String getString() {
return string;
}
// All of the other accessor methods, etc.
}
然后,您可以像这样在 Item 中定义 use 方法:
public abstract void use(UseParameters params);
并且任何使用 Item 的代码都必须适本地设置对象的参数:
Item item = // However you're going to get the item
UseParameters params = new UseParameters();
params.setString("good string");
params.setQueue(new Queue());
item.use(params);
我只想指出,如果上面的代码知道 Item 是一本书(这就是它知道设置 String 和 Queue 的方式),那么为什么不直接获取一本书并跳过需要一个带有变量用途的抽象类() 方法?但我离题了。无论如何,Book 会像这样实现 use() 方法:
@Override
public void use(UseParameters params) {
if(params.getString == null || params.getQueue() == null)
// throw exception
// Do what books do with strings and queues
}
我认为这可以满足您的需求,但我认为您应该考虑重构。
关于java - 具有可变参数列表的抽象方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17937003/