расширяет vs реализует видимость в дочернем классе

public interface A{
  public void doSomething();
}

public abstract class B{
  public void doSomething(){
    //implementation...
    }
  }

public abstract class C extends B implements A{
}

public class D extends C{
... //doSomething() is not overriden 
}

Это компилируется без проблем, даже когда экземпляр D вызывает метод doSomething().

Но jmockit выдает ошибку, когда метод вызывается из экземпляра D, и метод не переопределяется в D. Пожалуйста, объясните это поведение.


person 123_xyz    schedule 28.03.2018    source источник
comment
Связанный Тот же метод в интерфейсе и абстрактном классе.   -  person Zabuzard    schedule 28.03.2018
comment
Я думаю, вы должны включить достаточно кода, чтобы воспроизвести ошибку. Это совершенно законная Java, поэтому вопрос больше о том, как работает jmockit.   -  person cpp beginner    schedule 28.03.2018
comment
Я не вижу проблемы. Интерфейс A говорит: Эй, D, тебе нужен метод doSomething. Но это так, поскольку он расширяется от B, который обеспечивает реализацию.   -  person Zabuzard    schedule 28.03.2018
comment
Также это не имеет ничего общего с дженериками, поэтому вы можете удалить этот тег.   -  person FilipRistic    schedule 28.03.2018
comment
в нашей реализации это дженерики... вот почему я включил этот тег. тогда будет ли это иметь значение, когда абстрактный класс и интерфейс будут с дженериками?   -  person 123_xyz    schedule 28.03.2018
comment
Зависит от конкретного сценария. Если интерфейсу нужен метод, который работает с String, в то время как ваш метод из B работает с Integer, то методы отличаются, и вы упускаете реализацию для варианта String.   -  person Zabuzard    schedule 28.03.2018
comment
Я не могу воспроизвести ошибку с кодом, который вы публикуете...   -  person xingbin    schedule 28.03.2018
comment
Это как интерфейс A‹T, Long› абстрактный класс B‹T exteds X , Long› и. абстрактный класс C‹T расширяет X, Long›, а класс D‹T расширяет X, Long›   -  person 123_xyz    schedule 29.03.2018
comment
Покажите пример теста. Без него никто не сможет начать расследование проблемы. Мы даже не знаем, над каким классом надлежит смеяться...   -  person Rogério    schedule 30.03.2018
comment
Над классом D насмехаются... И в ожиданиях Block {DInstance.doSomething(); result =xyz;} тестируется класс X, членом которого является D.   -  person 123_xyz    schedule 31.03.2018


Ответы (1)


нашел решение. о чем я не упомянул, так это о том, что мы использовали jmockit версии 1.30, так как я не думал, что это будет проблемой. Эта проблема, по-видимому, была исправлена ​​в более высоких версиях.

https://github.com/jmockit/jmockit1/issues/389

person 123_xyz    schedule 10.04.2018