Java名称冲突错误,一个方法与另一个方法有相同的删除

标签 java generics inheritance compiler-errors name-clash

我有两个类(class),如下

查询结果类:

public class QueryResult
{
...
public static List sortResults(boolean ascending, List<QueryResult> toSort)
    {   ...
    }
}

和 CaseResult 类:

public class CaseResult extends QueryResult
{
...
public static List sortResults(boolean ascending, List<CaseResult> toSort)
    {   ...
    }
}

我收到以下错误:

Name clash: The method sortResults(boolean, List) of type CaseResult has the same erasure as sortResults(boolean, List) of type QueryResult but does not hide it CaseResult.java

我尝试了类似问题下的答案 Java generics name clash , has the same erasure但出现了更多错误。我认为我可能误解了某些内容,或者这些答案不适合我的情况。

有人可以提供任何解决方案或解释更多信息以帮助我理解吗?谢谢大家。

最佳答案

Darshit Chokshi 的回答中涵盖了错误的原因。 但是,由于尚未发布解决方案/替代方案,请尝试以下操作:

您正在尝试以这种方式重写 sortResults() 方法,以便可以对具有不同元素的列表进行排序。但是,覆盖时您需要具有相同的类型签名。在您的情况下,签名看起来相似,但由于 List 中的元素不同 - 编译器意识到 List 和 List 是不同的,但由于 Java 中的类型删除,因此不确定应该调用哪个方法- 即它应该调用父类(super class)方法还是子类方法。

不要重写,而是更改父类(super class)中的原始方法(在您的例子中为 QueryResult),以便它可以处理任何类型的 List 元素。您可以使用通配符捕获来完成此操作:

public class QueryResult {
...
public <T> static List<T> sortResults(boolean ascending, List<T> toSort) {   
    ...
    }
}

此方法接收一个列表,并将推断元素类型,将元素类型分配给泛型类型参数 T。每当您想要在方法主体中引用元素类型时,而不是使用元素类型名称(以前是 QueryResult 或 CaseResult),现在您可以使用泛型类型变量 T。

如果需要,您还可以对此变量设置进一步的界限(即,如果列表元素需要是 QueryResult 的子类型,您可以说 ),这将强制 Java 对 List 进行类型检查,并且它可能有什么类型的元素。

对您的原始代码的进一步评论。在新的泛型代码中使用原始类型时要非常小心 - 您将返回一个列表作为原始类型:List,而不指定列表的元素类型是什么,即参数化类型:List。这可能会导致许多问题,因此不建议这样做。 Java 创建者在 Java 中保留了这种形式的编码,以便向后兼容泛型之前存在的代码,但强烈建议不要以这种方式对新编写的代码进行编码。

您可以在教科书中阅读有关原始类型与参数化类型以及使用原始类型的陷阱的更多信息,以及有关通配符捕获和边界的更多信息:

Effective Java, by Joshua Bloch
    Section: Generics
    Item 23: Don't use raw types in new code
    Item 28: Use bounded wildcards to increase API flexibility

关于Java名称冲突错误,一个方法与另一个方法有相同的删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44939290/

相关文章:

java - Class<T> 用于 Java 中的泛型?

C++:模板化基类的范围?

java - 使用 OWL API 发出 SWRL 请求

java - 保存来自 Java 应用程序的信息

java - 应用程序能否更改 WebSphere 和 DB2 组合上每个单独事务的隔离级别

java - 为什么看起来调用了错误的方法?

c++ - 错误: no matching function for call to 'std::vector<Pet*>::vector(<brace-enclosed initializer list>)'

javascript - Chrome 中 ajax Restful ws 调用期间访问 CORS

.net - PowerShell 中的 IEnumerable<CustomType>

java - 返回与函数调用者类型相同的对象