【问题标题】:Java erasure error with unrelated generic in methodJava擦除错误与方法中不相关的泛型
【发布时间】:2009-06-01 18:02:48
【问题描述】:

我已经阅读了与擦除相关的其他问题,但我仍然不清楚为什么会在下面的课程中出现编译错误。其他问题涉及实际使用泛型类型的方法,而我只是尝试使用完全相同的签名来实现方法。谁能解释一下?

编译错误 -> 名称冲突:test.Baz 中的 bar(java.util.Set) 和 test.Foo 中的 bar(java.util.Set) 具有相同的擦除,但都不会覆盖另一个

import java.util.Set;

public class test {
  public interface Foo<T> {
    public void bar(Set<String> s);
  }

  public abstract class Baz implements Foo {
    public void bar(Set<String> s) {}
  }
}

【问题讨论】:

    标签: java generics


    【解决方案1】:

    您打算让 Baz 实现 Foo&lt;String&gt; 还是实现 Foo&lt;T&gt; 或实现 Foo?您键入的是最后一个,但这意味着 Bar 实现了“未通用”的 Foo。奇怪的是,这完全关闭了Foo 定义中的泛型,而不仅仅是与T 有关的泛型。

    这意味着在Baz 内部,方法Foo.bar 只接受Set 的参数,而不是Set&lt;String&gt;

    你想要:

    public abstract class Baz implements Foo {
      public void bar(Set s) {}
    }
    

    public abstract class Baz<T> implements Foo<T> {
      public void bar(Set<String> s) {}
    }
    

    public abstract class Baz implements Foo<Void> {
      public void bar(Set<String> s) {}
    }
    

    取决于你想要做什么。

    【讨论】:

    • 呵呵,我也想解释一下为什么错了……但我真的不知道为什么。 :(
    • 好吧,在我得到我的答案之前几分钟你就得到了答案,所以你抓住了“看看那里的一个答案,如果它甚至模糊地对它投赞成票”,这值得从 + 2 到 +7,取决于问题和一天中的时间。 (而且你知道你的答案也不会编译,对吧?)
    • Baz 是抽象的,所以我打算让具体的子类选择 T。您的第二个选项可能最接近我的意思。是的,奇怪的是它变成了所有泛型,而不仅仅是 T。这就是让我难过的地方。谢谢。
    • 我知道我在挖死人,但有人能指出为什么会发生这种情况(这就是所有仿制药都被关闭的原因)
    【解决方案2】:

    我认为你需要改变这个:

    public abstract class Baz implements Foo {
    

    到这里:

    public abstract class Baz implements Foo<T> {
    

    这样你就可以正确地覆盖函数Foo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多