两种方法具有相同的签名,为什么它的工作原理

时间:2013-05-07 11:56:58

标签: java generics methods jvm

我有一个将字符串视为集合的类。这是课程中的两种方法:

@Override
public <B> IndexedSeq<B> map(final Function1<? super Character, B> function) {...}

public RichString map(final Function1<? super Character, Character> function) {...}

这些方法的签名与我的问题相关。 现在,Eclipse确实发出警告,表明这两种方法具有相同的擦除功能。但是它仍然允许我创建它们,并且它们按预期工作:每当我提供一个将Character转换为Character的函数时,就会返回一个RichString,如我所愿。

我的问题是它为什么有用,因为在运行时没有关于泛型类型的信息,并且方法的返回不是方法签名的一部分?当我调用它们时,JVM如何知道调用这两种方法中的哪一种?

编辑:

我认为,在擦除之后,这两种方法将具有以下特征:

@Override
public IndexedSeq map(final Function1<Object, Object> function) {...}

public RichString map(final Function1<Object, Object> function) {...}

这会使它们的区别仅在于返回类型。

2 个答案:

答案 0 :(得分:2)

你说这不应该编译。 Java 6中存在一个错误,导致错误地接受这样的代码:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6182950

答案 1 :(得分:1)

  1. 运行时在类/方法签名方面有很多关于泛型类型的信息,而不是涉及对象实例时。第二次重载的整个签名可能可以通过反射来检索。
  2. 没关系,因为方法重载无论如何都会在编译时解决。有可能在那里解决模糊性,例如由编译器考虑类型Function<Character, Character>的参数的第二次重载“更具体”。