gpt4 book ai didi

java - 泛型、 super 和扩展的问题

转载 作者:行者123 更新时间:2023-11-30 09:19:39 25 4
gpt4 key购买 nike

我有一个(通用)类,它保存其他类的元数据。元数据以多种方式使用(写入和读取 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) {
}
}

如果您不想创建另一种方法,您可以使用复合方法。关于组合优于继承的讨论很多。

除了 AB 类之外,一切都是一样的:

  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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com