猿问

方法与类型中的另一个方法具有相同的擦除性。

方法与类型中的另一个方法具有相同的擦除性。

为什么在同一个类中使用这两种方法是不合法的?

class Test{
   void add(Set<Integer> ii){}
   void add(Set<String> ss){}}

我得到了compilation error

方法add(Set)与类型测试中的另一个方法具有相同的擦除Add(Set)。

虽然我可以解决这个问题,但我想知道为什么javac不喜欢这样做。

我可以看到,在许多情况下,这两种方法的逻辑非常相似,可以用一个

public void add(Set<?> set){}

方法,但情况并不总是如此。

如果你想要两个的话,这太烦人了。constructors使用这些参数,因为您不能只更改其中一个参数的名称。constructors.


叮当猫咪
浏览 919回答 3
3回答

拉莫斯之舞

Java泛型使用类型擦除。尖括号中的位(<Integer>和<String>)被删除,因此您将得到两个具有相同签名的方法(add(Set)你可以从错误中看到)。这是不允许的,因为运行时不知道在每种情况下使用哪一种。如果Java得到了具体化的泛型,那么您可以这样做,但现在可能不太可能了。

森栏

问题是Set<Integer>和Set<String>实际上被视为Set来自JVM。为SET选择一个类型(在您的情况下是String或Integer)只是编译器使用的语法糖。JVM无法区分Set<String>和Set<Integer>.
随时随地看视频慕课网APP

相关分类

Java
我要回答