我有一个(通用)类,它保存其他类的元数据。元数据有多种使用方式(写入和读取 XML 数据、数据库、输出为文本等)。到目前为止这有效。但是当我将所有这些用于从其他类继承的类时,我遇到了一个问题。
请看一下下面的代码(我尝试生成一个可编译的最小示例,除了下面标记的行之外):
class A {
public Meta<? extends A> getMeta() {
return new Meta<A>();
}
public void output() {
/*
* Error shown in eclipse for the next line:
* The method output(capture#1-of ? extends A) in the type
* Outputter<capture#1-of ? extends A> is not applicable for the arguments
* (A)
*/
getMeta().getOutputter().output(this);
}
}
class B extends A {
@Override
public Meta<? extends B> getMeta() {
return new Meta<B>();
}
}
class Meta<CLS> {
public Outputter<CLS> getOutputter() {
return null;
}
}
class Outputter<CLS> {
public void output(CLS obj) {
}
}
我可以更改A.getMeta()
返回Meta<A>
使上面的行可编译,但随后我无法将其覆盖为 Meta<B> getMeta()
B 类。
关于如何解决这个问题有什么想法吗?
最佳答案
如果你这样做怎么办?它还需要一个类,但看起来它会起作用:
class T{
//put common methods here, generic methods are not common, so they will not be here
}
class A extends T{
public Meta<A> getMeta() {
return new Meta<A>();
}
public void output() {
/*
* Error shown in eclipse for the next line:
* The method output(capture#1-of ? extends A) in the type
* Outputter<capture#1-of ? extends A> is not applicable for the arguments
* (A)
*/
getMeta().getOutputter().output(this);
}
}
class B extends T {
public Meta<B> getMeta() {
return new Meta<B>();
}
}
class Meta<CLS> {
public Outputter<CLS> getOutputter() {
return null;
}
}
class Outputter<CLS> {
public void output(CLS obj) {
}
}
如果您不想创建其他方法,您可以使用复合方法。关于组合优于继承,有很多很好的讨论。
除了 A
和 B
类之外,一切都一样:
class A{
public Meta<A> getMeta() {
return new Meta<A>();
}
...
}
class B {
private class A a;
public Meta<B> getMeta() {
return new Meta<B>();
}
//use a here if you need, a is composed into B
}
关于java - 泛型、 super 和扩展的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17852504/