Я ищу способ иметь в абстрактном методе возвращаемый тип, который будет одним из вариантов реализации, вызывающим метод.Динамический возвращаемый тип реализации, объявленный абстрактным методом
Другими словами, я хотел бы написать что-то вроде этого:
public class GenericClass {
public <T extends GenericClass> T returnMyself() {
return (T)this; // Compiler warning, unsafe cast
}
}
public class Implem1 extends GenericClass {}
public class Implem2 extends GenericClass {}
public class Main {
public static void main(String[] args) {
Implem1 implem1 = new Implem1();
Implem1 again1 = implem1.returnMyself(); // Works fine, the type is inferred by the type of again1, I think
Implem1 again2 = implem1.<Implem1>returnMyself(); // Works fine, the type is explicitly asked by <Implem1>
Implem2 again3 = implem1.returnMyself(); // Works fine while it shouldn't.
}
}
То, что я ищу является способ объявить метод так, что во время компиляции, returnMyself() может возвращать только тип (в моем примере, implem1 имеет тип Implem1), и убедитесь, что вызов кода не может ошибочно/смешивать типы.
Я искал довольно много, но не мог найти свой ответ нигде (некоторые темы кажутся похожими, но требуют более общего случая, а не явно типа реализации, вызывающего метод).
Некоторые ответы были правильными, но всегда подразумевались для переопределения метода в каждом классе реализации, который может быть громоздким и подверженным ошибкам на моей стороне. Я идеально ищу метод, который мне пришлось бы писать только один раз в классе Abstract.
Любая помощь/ответ оценил: D
Хотя это делает трюк, для этого требуется переопределить каждый дочерний класс, чтобы написать почти тот же фрагмент кода (кроме типа возврата). Я ожидал, что смогу написать его раз и навсегда в абстрактном классе ... Но я думаю, что это невозможно в Java? – jdebon
Хмм, я думаю, написав это только один раз, когда это невозможно ... – MinecraftShamrock
Принимая ответ, потому что это самый близкий ответ на мой вопрос, хотя я как бы надеялся, что будет более разумный способ :(Спасибо вам! – jdebon