为什么我不能在Java中为单个类定义这两个构造函数?

Emi*_*mil 4 java constructor type-erasure

我正在为一个类定义一个构造函数,我有这两个定义:

MyClass(Set<ClassA> setOfA) { ... }

MyClass(Set<ClassB> setOfB) { ... }
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

MyClass(java.util.Set<ClassA>) is already defined in MyClass
    MyClass(Set<ClassB> setOfB)
Run Code Online (Sandbox Code Playgroud)

如果我特意将其中一个设为HashSet而不是Set,则代码会编译.为什么?

awk*_*ksp 7

如果你有

MyClass(Set<A> setOfA) { ... }

MyClass(Set<B> setOfB) { ... }
Run Code Online (Sandbox Code Playgroud)

类型擦除将它们变成:

MyClass(Set setOfA) { ... }

MyClass(Set setOfB) { ... }
Run Code Online (Sandbox Code Playgroud)

所以现在他们是一样的,编译器很困惑.

但是,如果其中一个是a HashSet,你最终得到这个:

MyClass(Set setOfA) { ... }

MyClass(HashSet setOfB) { ... }
Run Code Online (Sandbox Code Playgroud)

现在,它们与编译器完全不同,以确定在编译时绑定哪个.


Chr*_*ian 5

由于类型擦除,Java编译器将(根据Java文档):

  • 将泛型类型中的所有类型参数替换为其边界,或者Object如果类型参数是无界的...
  • 如有必要,插入类型铸件以保持类型安全.
  • 生成桥接方法以保留扩展泛型类型中的多态性.

换句话说,Java编译器会将代码转换为:

MyClass(Set setOfA) { ... }

MyClass(Set setOfB) { ... }
Run Code Online (Sandbox Code Playgroud)

所以两者都有相同的参数.这就是错误的原因.