【问题标题】:Is it a bridge method?是桥接法吗?
【发布时间】:2015-03-19 22:53:03
【问题描述】:

为什么可以编译具有相同签名的两个方法的类?
“foo”方法只有不同的返回类型。
但是返回类型不是 java 中方法签名的一部分。
java编译器在这种情况下会创建桥接方法吗?
如果是 - 真实的代码会是什么样子?

对于 foo 方法有以下警告:

方法 foo(GenClass) 具有相同的擦除 foo(GenClass) 类型测试中的另一种方法

如果取消注释bar方法,bar方法会出现以下错误:

方法 bar(GenClass) 具有相同的擦除条(GenClass) 类型测试中的另一种方法

class GenClass<T> {

}
public class test {
    public static void main(String[] args) {

    }

    public static Integer foo(GenClass<Integer> criteria) {
        System.out.println("Integer");
        return null;
    }

    public static String foo(GenClass<String> criteria) {
        System.out.println("String");
        return null;
    }

    /*public static void bar(GenClass<Integer> criteria) {
        System.out.println("Integer");
    }

    public static void bar(GenClass<String> criteria) {
        System.out.println("String");
    }*/
}

D:\tools\java\jdk1.6.0_37_32\bin>java -version
java版本“1.6.0_38”
Java(TM) SE 运行时环境(内部版本 1.6.0_38-b05)
Java HotSpot(TM) 64 位服务器 VM(内部版本 20.13-b02,混合模式)

【问题讨论】:

  • 对我来说不可能编译你的代码。 Error:(33, 19) java: name clash: foo(designPatterns.singleton.GenClass&lt;java.lang.String&gt;) and foo(designPatterns.singleton.GenClass&lt;java.lang.Integer&gt;) have the same erasure
  • 是的,有可能……
  • 此代码不能使用 JDK7 或 JDK8 编译。但是,在旧版本中,它只会生成警告。
  • 这绝对和bridge methods无关。

标签: java generics


【解决方案1】:

javac Java 6 中的一个错误使这项工作正常进行,但其他用于 Java 6 的 Java 编译器以及 Java 7+ 中的 Java 编译器会抛出编译错误。

查看其他帖子了解更多详情:

Does a method's signature in Java include its return type?

http://vanillajava.blogspot.co.uk/2011/02/with-generics-return-type-is-part-of.html

编辑

@Radek 在 cmets 部分发布了另一个很好的 Stackoverflow 帖子:

Method has the same erasure as another method in type

编辑 2 我想我在这里找到了错误票: http://bugs.java.com/view_bug.do?bug_id=6182950

【讨论】:

  • 你知道票号吗?
  • @VladimirBezugliy 更新了带有潜在门票链接的帖子
猜你喜欢
  • 1970-01-01
  • 2011-12-22
  • 2023-02-08
  • 2013-10-12
  • 2013-07-14
  • 1970-01-01
  • 1970-01-01
  • 2016-07-26
  • 1970-01-01
相关资源
最近更新 更多