Подводя итог (и я надеюсь, что я правильно понял вопрос!), На Java вы можете сделать
final View view = getContainer().getSpecificView(); // or
final ISpecificView iview = getContainer().getSpecificView();
В Котлине тоже самое
val view: View = getContainer().getSpecificView()
Результаты в Type inference failed: Not enough information to infer parameter T
После 50 минут попыток и попыток ...
Просто создайте манекен class
(аннотация?)
abstract class KView : View(), ISpecificView
И использовать его для явного задания универсального типа возвращаемого значения
val view: View = getContainer().getSpecificView<KView>()
view.whateverClassMethod()
val iview: ISpecificView = getContainer().getSpecificView<KView>()
iview.whateverInterfaceMethod()
// or just
(getContainer().getSpecificView<KView>() as View).whateverClassMethod()
(getContainer().getSpecificView<KView>() as ISpecificView).whateverInterfaceMethod()
Требуется конкретное приведение к View
или ISpecificView
, потому что если вы просто сделаете
getContainer().getSpecificView<KView>()
вы получите
class your.package$ExtendingClass cannot be cast to class your.package.KView
но это прекрасно.
Даже в Java вам нужно решить, хотите ли вы View
или ISpecificView
.
Таким образом, вы сможете работать со всеми методами View
или ISpecificView
.
Действительно, я не знаю, что еще попробовать. Надеюсь, кто-нибудь придумает что-нибудь получше.
Редактировать: если вы имеете в виду на Java, вы делаете
final ExtendedView ev = getContainer().getSpecificView();
ну, это немного неправильно imho, даже если он компилируется, так как вы не можете гарантировать, что тип возвращаемого значения действительно ExtendedView
. Вы точно знаете, что он расширяет View
и реализует ISpecificView
.