好吧,我从来没有大量使用过泛型,想知道我是否可以按以下方式使用它们。
假设我有这门课
public class ASuperClass {
public abstract void doSomething(String arg1, Integer arg2);
}
因此,如果我随后扩展上面的类,我将得到以下内容,我将被迫使用 String 和 Integer 的参数列表覆盖 doSomething。
public class ASubClass extends ASuperClass{
@Override
public void doSomething(String arg1, Integer arg2){
some code.....
}
}
现在,假设在我的子类中我可以覆盖 doSomething,但我需要在我的子类中添加一个额外的 String arg。所以,我想做的是:
public class ASubClass extends ASuperClass{
@Override
public void doSomething(String arg1, Integer arg2, String arg3){
some code...
}
}
上面的代码不会编译,因为我的子类没有实现基类中定义的抽象签名。所以,为了让它编译,我当然可以这样做:
public class ASubClass extends ASuperClass{
@Override
public void doSomething(String arg1, Integer arg2){}
public void doSomething(String arg1, Integer areg2, String arg3){
here is my code......
}
}
那么,您可能会问我到底想做什么?我感兴趣的是,有没有一种方法可以使用泛型作为 arg 来“强制”类的任何子类来实现基本抽象方法,而不管 arg 列表。这样下面的代码将编译扩展 ASuperClass:
public class ASubClass extends ASuperClass{
@Override
public void doSomething(String arg1, Integer areg2, String arg3){
here is my code......
}
}
public class AnotherSubClass extends ASuperClass{
@Override
public void doSomething(String arg1, Integer areg2, String arg3, Integer arg4){
here is my code......
}
}
那么,您能否“通用化”基类 arg 列表,以便上述两个类能够编译?像下面这样的东西?我知道下面的语法是错误的,但你能使 arg 列表通用吗?
public class ASuperClass {
public abstract void doSomething(<?>);
}
总的来说,我的想法是在人们扩展某些基本功能的应用程序中强制执行一致性。基本上确保 ASuperClass 的每个子类都有一个 doSomething() 成员函数,以确保跨子类的一致性(特别是方法命名),但每个子类的 arg 列表可能不同。
希望上面的内容不会太困惑。有兴趣知道这是否可能。
最佳答案
方法参数是方法“签名”的一部分,用于决定覆盖。为了使子类重写其基类中的方法、实现其抽象基类的抽象方法或实现接口(interface)方法,包括参数类型在内的整个签名必须匹配。
如果您希望参数列表采用可变数量的参数,您可以使用以下语法:
public abstract void doSomething(Object ... args);
您可以在子类中覆盖具有此签名的方法,并且可以传递任意数量的参数。这个设计决定的一些不幸后果是
- 您的参数现在是无类型的 - 在继续计算之前,每个方法都需要验证其参数列表,包括它们的类型,并且
- 原始类型的参数需要包装在
Object
中 - 原始类型需要装箱或自动装箱。
关于java - 关于 Java 泛型和子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21287652/