在使用泛型的扩展接口中覆盖方法契约(Java)?

6
我试图覆盖一个继承另一个接口的方法声明,这两个接口都使用泛型。根据Java教程,这应该是可能的,但示例没有使用泛型。当我尝试实现它时,编译器显示以下错误(我已经替换了名称,因为其中一些代码不是我的):
InterfaceExtended中的myMethod(T)与Interface中的myMethod(T)冲突; 两个方法具有相同的擦除,但没有一个覆盖另一个。
代码看起来像这样:
public interface Interface<T>
{
public void myMethod(T x);
}

public interface ExtendedInterface<T> extends Interface<T>
{
public void myMethod(T x);
}

如果有人能提出建议,让这个方案变得可接受,或者解释一下为什么会引起问题,我将非常感激。谢谢!- badPanda

3
不要重写这个方法,它没有任何意义。 - Skip Head
这是一个任务,明确指定了我必须要做的。如果是我的代码,我是不会...的。 - badpanda
你是剪切和粘贴代码还是重新输入的?因为你的错误信息与你的代码不匹配(InterfaceExtended vs ExtendedInterface)。 - robert_x44
所以有点尴尬,但是我的问题与我之前代码中的一个拼写错误有关。我应该知道不要在凌晨4点写这些东西>< 谢谢大家的帮助,现在我更加详细地理解了代码的工作方式。 - badpanda
@Colin Hebert,感谢您指出这一点。不过,在问题中给出的情况下,它是无用的。 - Skip Head
显示剩余3条评论
2个回答

5

您想要一个重载版本的myMethod方法吗?那么您不应该两次使用T,而应该像这样:

public interface Interface<T>
{
  public void myMethod(T x);
}

public interface ExtendedInterface<T, V> extends Interface<T>
{
  public void myMethod(V x);
}

现在可以实现类似这样的效果:
class MyClass implements ExtendedInterface<String, Integer> {
  public void myMethod(String x) { .. }
  public void myMethod(Integer x) { .. }
}

编辑:有趣的是,这也可以工作(尽管没有用):
class MyClass implements ExtendedInterface<String, String> {
  public void myMethod(String x) { .. }
}

你使用的Java版本是什么?在Eclipse下,Java 1.6可以正常工作。 - Marc
@badpanda,那是因为你实现了两次相同的接口。 - Colin Hebert

1

这是有效的。如果您的类使用两个不同的泛型类型实现了相同的接口,则可能会出现问题。

例如:

class MyClass implements Interface<String>, ExtendedInteface<Integer>{
}

例如,this code 只在第三个类上失败。
这是我在 IntelliJ X 上收到的消息: alt text

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接