Я пытаюсь объединить цепочку методов с расширениями класса и методом, определенным в базовом классе. Однако я изо всех сил пытаюсь заставить его работать, так как я еще не очень хорошо знаком с дженериками. Может ли кто-нибудь помочь мне заставить это работать? Это было бы очень признательно. Спасибо!
Текущая ситуация:
public abstract class A<T extends A<?>> extends F // the base class, all others extend this one (either direct or indirect)
public T isLoaded() { // method defined in class A
// Omitted
return (T) this;
}
public class B extends A<B> // One of the classes that extends the base class
public D tapButton() // Method defined in class B
public class C extends A<C> // Another class that extends the base class, also has a child itself
public C setAmount(int amount) // method defined in class C
public class D extends C // Class that extends the previous one (C)
public E tapButtonTwo() // Method defined in class D, can't move this one level up to due to other parts of the code
Код, который пытается использовать эти классы и методы:
// Failing scenario
protected void doSomething() {
// I already have an instance of type B, but I omitted this part
b.tapButton() // returns type D
.isLoaded() // returns type C and is the cause of the problem
.setAmount(10) // returns type C
.tapButtonTwo() // fails on: cannot resolve method
}
// Scenario that does work:
protected void doSomething() {
// I already have an instance of type B, but I omitted this part
b.tapButton() // returns type D
.setAmount(10) // now returns type D
.tapButtonTwo() // works
}
D
расширяетC
, что означает, что он расширяетA<C>
, а неA<D>
. - person JimmyB   schedule 02.05.2019D
классом, расширяющимC
, где классC
всегда будет возвращать объект типаC
при вызовеisLoaded
. Вы можете просто переопределить методisLoaded
в своем классеD
, чтобы вернуть объект типа D вместо понижения доC
. - person Rann Lifshitz   schedule 02.05.2019C
придется объявить о возвратеD
, чего он не может. - person JimmyB   schedule 02.05.2019D
, который расширяетC
, таким образом наследуя все методыC
s. ПереопределениеisLoaded
в классеD
позволит вернуть экземпляр как фактический экземплярD
вместо экземпляраC
. - person Rann Lifshitz   schedule 02.05.2019A
. - person JimmyB   schedule 02.05.2019