Java 8重写时该方法不明确

2019年7月5日 13点热度 0条评论

我在Java 8中使用以下代码遇到问题,在Java 7中,代码工作正常,但是当我将其更改为Java 8时,它显示此错误:

The method mymethod(arg1,context,arg2) is ambiguous for the type Z.

我尝试在调用该方法时使用
AbstractContext<MyModel>,在Eclipse中该错误消失了,但在编译时仍然发生。有人知道什么地方可能出问题吗?

public interface K<T extends MyModel>{
AbstractContext<T> create(T context, SomeObject arg1, SomeObject1 arg2);
}

public abstract class X {

@Override 
public AbstractContext<MyModel> create(final MyModel context,final SomeObject1 arg1,SomeObject2 arg2){
//somelogic
}
   protected String mymethod(final SomeObject arg1,
          final AbstractContext<MyModel> context, final SomeObject1 arg2){
      //some logic 
      return "test";
   }
}

public class Y extends X implements Z<MyModel>{

@Override 
public AbstractContext<MyModel> create(final MyModel context,final 
SomeObject1 arg1,SomeObject2 arg2){
//somelogic
}
   protected String mymethod(final SomeObject arg1,
           final AbstractContext<MyModel> context, final SomeObject1 arg2){
      return super.mymethod(arg1,context,arg2);
   }
}

public class Z extends Y {
   protected void somemethod(arg1,context,arg2){
     //some logic
      this.mymethod(arg1,context,arg2); 
    }//here error occurs


@Override
protected String mymethod(final SomeObject arg1,
           final AbstractContext<MyModel> context, final SomeObject1 arg2){
      //some new logic 
      return "newtest";
   }
}

解决方案如下:

您提供的代码不完整或太含糊,我不知道您要做什么?

那是您的第一个类,很正常(在jdk7,8,9,10&11上运行)

public abstract class X {
   protected String mymethod(final SomeObject arg1,final 
   AbstractContext<MyModel> context,final SomeObject1 arg2){
      //some logic 
      return "test";
   }
}

那是你的第二堂课:

public class Y extends X {
   protected String mymethod(final SomeObject arg1,final 
   AbstractContext<MyModel> context,final SomeObject1 arg2){
      return super.mymethod(arg1,context,arg2);
   }
}

关于它的快速提示如果您不想更改某个方法的行为,请不要重写该方法。

现在是第三类:

public class Z extends Y {
   protected void somemethod(){
      this.mymethod(arg1,context,arg2); 
    }//here error occurs
}

有一些您使用过的变量,但是您没有定义-甚至没有初始化-因此,当然在您使用此行的这行中有一个错误,我使用jdk7测试了相同的代码,并出现了相同的错误。

最后一个代码,它不是一个类,而是一个不属于上述任何一个类的方法:

@Override
protected String mymethod(final SomeObject arg1,final 
   AbstractContext<MyModel> context,final SomeObject1 arg2){
      //some new logic 
      return "newtest";
   }

您不能在Java中创建不属于任何类的方法。

(希望您在使用不同版本的JDK之前了解有关Java的更多信息)