У меня есть (неабстрактная) базовая база class A<L,M>
, абстрактная универсальная субмарина class B<K, L, M> extends A<L,M>
и (не абстрактная) class C extends B<Integer, Integer, Void>
:
public class A<L,M> { }
public abstract class B<K, L, M> extends A<L,M> { }
public class C extends B<Integer, Integer, Void> { }
У меня есть класс utils, в котором есть несколько методов, здесь уместны два:
public static <K, L, M> void doSomething(B<K, L, M> b) {...}
public static <L, M> void doSomething(A<L, M> a) {...}
Для ясности, оба метода имеют одно и то же имя.
Если я вызываю doSomething(c);
(где C c
), то это происходит так, как и ожидалось для 1-го метода.
Моя проблема со следующим кодом (в другом классе, который использует утилиты):
private void doSomethingMoreComplex(A a) { // a is actually C
Utils.doSomething(a);
}
Так что здесь a
на самом деле C
, но это касается второго метода, я не уверен, допустил ли я ошибку в коде или это действительно ожидаемое поведение.