4

我的 Java 代码有问题。我有四个(重要的)课程:

public class RDOutput extends OutputType
public class RDAnalysis extends AnalysisProperties 

现在我正在尝试在分析属性中创建一个方法:

public abstract void display(ArrayList<? extends OutputType> results);

主要问题列表,ArrayList中的对象会是OutputType的不同子类型。在我的课程 RDAnalysis 中,我尝试进行特定的覆盖:

public void display(ArrayList<RDOutput> results) {

但 Eclipse 说:名称冲突:RDAnalysis 类型的方法 display(ArrayList) 与 AnalysisProperties 类型的 display(ArrayList? extends OutputType) 具有相同的擦除,但不会覆盖它

我不熟悉 Java 技巧,我尝试在文档中搜索,但没有找到任何解决此问题的方法。我的问题是:我正在做的那个技巧(抽象中的基本类型和最终函数中的扩展)在 Java 中是否可行(如果是,我该怎么做?)还是我必须做一些枚举来解决这个问题?

4

5 回答 5

3

我建议你在你的类中引入泛型参数并用它来参数化你的方法:

public abstract class A<T extends OutputType> {
    public abstract void display(ArrayList<T> results);     
}

public class B extends A<RDOutput> {
    public void display(ArrayList<RDOutput> results) {}     
}
于 2012-11-20T20:38:51.517 回答
2

这是因为您的显示并未涵盖抽象方法的所有情况。也许尝试这样的事情:

public class RDOutput extends OutputType {}

public class OutputType {}

public abstract class AnalysisProperties<T extends OutputType> {
    public abstract void display(ArrayList<T> results);
}

public class RDAnalysis extends AnalysisProperties<RDOutput> {
    @Override
    public void display(final ArrayList<RDOutput> results) {
    }
}
于 2012-11-20T20:40:51.740 回答
0

问题是您试图在限制可能的参数的同时覆盖方法。

=>ArrayList<? extends OutputType>接受比ArrayList<RDOutput>因为RDOutputextends更多的可能元素OutputType

你打破了这条规则:相关的子类方法必须至少包含超类一的元素,并且永远不要限制它们。

所以编译器避免验证这个覆盖。

顺便说一句,避免使用具体值(如ArrayList. LinkedList作为参数传递的呢?...更喜欢更通用的相关类型,例如List.

于 2012-11-20T20:43:22.337 回答
0

这里的问题是,在类型擦除发挥作用之后,这两种方法的签名无法区分:它们具有相同的返回类型,并且都可以接受 aArrayList<RDOutput>但第一个(泛型)也可以接受 any ArrayList<T extends OutputType>

这意味着,尽管如果传递 JVM 将无法选择在运行时调用哪一个ArrayList<RDOutput>,但同时您的display方法不会覆盖抽象的方法,因为您的方法仅适用于 列表RDOutput,所以如果您通过aList<T extends OutputType>T != RDOutput您的具体实现不接受它。

您应该考虑按照其他答案中的建议在整个类上使用类型参数,或者接受这样一个事实,即如果没有强制转换,您将无法在方法中使用任何RDOutput特定方法display

于 2012-11-20T20:44:25.617 回答
0

如果一个方法正在等待ArrayList<? extends OutputType>

ArrayList<RDOutput>不能传递给它,因为父类型允许在 arraylist 中的任何子类 OutputType。

考虑这样的代码

AnalysisProperties properties = new RDAnalysis();
properties.display(arraylist consisting of any child class of OutputType); //this line will        cause runtime problems
于 2012-11-20T20:39:07.143 回答