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

时间:2010-10-18 17:25:29

标签: java generics interface polymorphism override

我试图覆盖扩展另一个接口的接口中的方法声明。这两个接口都使用泛型。根据Java教程,这应该是可能的,但该示例不使用泛型。当我尝试实现它时,编译器显示以下错误(我已经替换了名称,因为某些代码不是我自己的。):

  InterfaceExtended中的

myMethod(T)   在接口中与myMethod(T)发生冲突;   两种方法都有相同的擦除,   但是没有超越对方。

代码如下所示:

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

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

如果有人建议如何改变这一点以使其可以接受,或者说明导致问题的原因,我将非常感激。

谢谢!

badPanda

2 个答案:

答案 0 :(得分:4)

你想要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) { .. }
}

答案 1 :(得分:1)

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

例如:

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

例如this code仅在第三个类失败。

这是我在IntelliJ X上的消息: alt text