Можно ли повысить тип геттера свойств?
Например, внутри объявления класса у меня есть val member = Implementation()
, но я хочу, чтобы геттер public возвращал ссылку, набранную с помощью SomeInterface
, предполагая, что Implementation
является подтипом SomeInterface
, тогда как внутри объявления класса этот тип будет использоваться как экземпляр Implementation
.
Вот полный пример на Java, чтобы дать четкое представление:
public class MyViewModel extends ViewModel {
private final MutableLiveData<Settings> settings = new MutableLiveData<>();
public LiveData<Settings> getSettings() {
return settings;
}
public void updateSettings() {
settings.setValue(new Settings());
}
}
Здесь это «свойство» видно снаружи как LiveData
(супертип MutableLiveData
), но внутри класса его можно использовать как MutableLiveData
.
Я бы сказал, что это звучит естественно, но кажется, что Котлин этого не позволяет. Я что-то упускаю? Или создание private val _private = Implementation()
и val _public: SomeInterface = _private
или реализация пользовательского метода с семантикой геттера и измененным именем, имеющим возвращаемый тип SomeInterface
, является единственным способом добиться этого?
getSettings().setValue(...)
, который не будет компилировать IMO, но вы вызываетеsettings.setValue(...)
, вы можете это сделать, потому чтоsettings
имеет типMutableLiveData
, аgetSettings()
— нет. У меня тот же вариант использования, что и у вас, сLiveData
, и я использую комбинацию переменных_private
иpublic
, как вы предлагаете в своем посте. - person Maroš Šeleng   schedule 28.11.2018val someObject = Implementation()
иget(): SomeInterface
- person nyarian   schedule 28.11.2018