Java 8重写时该方法不明确

时间:2018-07-30 09:30:32

标签: java java-8 compiler-errors override ambiguous

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

  

对于类型Z,mymethod(arg1,context,arg2)方法不明确。

我尝试在调用方法时使用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";
   }
}

1 个答案:

答案 0 :(得分:0)

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

那是您的第一堂课,很正常(在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测试了相同的代码,并出现了相同的错误。 / p>

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

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

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

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