删除集合通用和冲突重载

时间:2015-06-01 14:45:43

标签: java type-erasure generics

我有一个相当中心的类负责一些Utility方法。我想为声明如下的方法提供额外的重载:

public static void removeDuplicated(Collection fullList, Collection itemsToRemove) {
   //implementation stripped for brevity
}

既然我并不喜欢Rawtypes,我将这些系列指定为我可以预期的最小公分母:

public static void removeDuplicated(Collection<Map<?,?>> fullList,
     Collection<Map<?,?>> itemsToRemove) {}

到目前为止,这已经摆脱了原型警告,并且到目前为止还没有完成。

我继续为我的重载编写方法标题:

public static <T extends TeObjectWrapper> void removeDuplicated(
     Collection<T> fullList, Collection<Map<?,?>> itemsToRemove) {}

这是eclipse(随后通过ant使用javac6进行编译)给出了以下错误信息:

  

方法removeDuplicated(Collection<T>, Collection<? extends Map<?,?>>)的删除与[Utilites-Class]类型中的另一种方法相同

现在,由于我已经遇到了通配符泛型及其删除问题,我尝试通过用Object替换未绑定的通配符来完全指定内容。错误消息仍然存在。

根据我的理解,第一个现有的重载应该擦除到Collection<Map<Object, Object>>,第二个应该擦除到Collection<TeObjectWrapper>

这些擦除的唯一方法是,如果TeObjectWrapper实现了Map(或扩展的Map的实现类之一),但事实并非如此。这可以在TeObjectWrapper的超类型层次结构中看到:

Supertype hierarchy: -TeObjectWrapper extends Object, implements <TeObjectAbstract implements TeBaseAbstract>

为什么编译器会认为删除相同,我怎么能让他不这么认为?

1 个答案:

答案 0 :(得分:6)

它们都擦除到public static void removeDuplicated(Collection, Collection)。整个参数化被删除。你需要给他们不同的名字。

来自4.6. Type Erasure

  

类型擦除是类型的映射(从不参数化类型或类型变量)。

     

类型擦除还会将构造函数或方法的签名映射到具有无参数化类型或类型变量的签名。

擦除意味着:通用的一切都消失了。

(但是,作为一个有趣的附注,通用信息 present in the class file。重载规则是由于给出了Java规范的方式,不一定是因为它&# 39;在技术上不可行。它更像是一种向后兼容的东西,允许遗留的非泛型类覆盖泛型方法。如果在未来的语言版本中删除了原始类型,可以允许这样的重载。)