8

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

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

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

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

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

编辑:

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

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

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

这将使它们仅在返回类型上有所不同。

4

2 回答 2

2

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

于 2013-05-08T00:17:20.050 回答
1
  1. 当涉及到类/方法签名时,运行时有大量关于泛型类型的信息,但在涉及对象实例时却没有。第二个重载的整个签名可能可以通过反射来检索。
  2. 没关系,因为无论如何方法重载都是在编译时解决的。歧义可能在那里得到解决,例如,编译器考虑到类型参数的第二个重载“更具体” Function<Character, Character>
于 2013-05-07T12:09:09.260 回答