【问题标题】:Overriding a method contract in an extended interface that uses generics (Java)?在使用泛型 (Java) 的扩展接口中覆盖方法协定?
【发布时间】:2010-10-18 17:25:28
【问题描述】:

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

接口扩展中的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);
}

如果有人对如何改变它以使其可以接受提出建议,或者解释造成问题的原因,我将不胜感激。

谢谢!

坏熊猫

【问题讨论】:

  • 只是不要覆盖该方法。它什么也没增加。
  • 这是一个作业,明确指定我必须。如果是我自己的代码,我不会……
  • 有趣...您使用的是什么 IDE?我正在使用 IntelliJ,Java 1.6 - 7。
  • 您是剪切并粘贴代码还是重新输入?因为您的错误消息与您的代码不匹配(InterfaceExtended vs ExtendedInterface)
  • 我完全重新输入了它,因为我觉得有必要为方法和接口使用不同的名称,因为其中一个接口不是我的。此外,它们相当复杂,我简化为相关代码。

标签: java generics interface polymorphism overriding


【解决方案1】:

您想要一个重载版本的 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 中,这可以正常工作。
  • @badpanda,那是因为你实现了两次相同的接口
【解决方案2】:

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

例如:

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

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

这是我在 IntelliJ X 上的消息:

【讨论】:

    猜你喜欢
    • 2014-05-23
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多