是否可以更改Kotlin';s属性getter类型?

是否可以更改Kotlin';s属性getter类型?,kotlin,properties,getter,upcasting,Kotlin,Properties,Getter,Upcasting,是否可以向上转换getter类型的属性 例如,在类声明中,我有val member=Implementation(),但我希望public获取程序返回使用SomeInterface键入的引用,假设Implementation是SomeInterface的子类型,而在类声明中,该类型将用作实现实例 下面是一个完整的Java示例,可以清楚地看到: public class MyViewModel extends ViewModel { private final MutableLiveDat

是否可以向上转换getter类型的属性

例如,在类声明中,我有
val member=Implementation()
,但我希望public获取程序返回使用
SomeInterface
键入的引用,假设
Implementation
SomeInterface
的子类型,而在类声明中,该类型将用作
实现
实例

下面是一个完整的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());
    }
}
公共类MyViewModel扩展了ViewModel{
私有最终MutableLiveData设置=新的MutableLiveData();
公共LiveData getSettings(){
返回设置;
}
公共无效更新设置(){
settings.setValue(新设置());
}
}
在这里,此“属性”在外部作为
LiveData
MutableLiveData
的超类型)可见,但在类内部可以将其用作
MutableLiveData

我会说这听起来很自然,但科特林似乎不允许这样。我错过什么了吗?或者创建
private val\u private=Implementation()
val\u public:SomeInterface=\u private
或者实现一个具有getter语义和修改名称的自定义方法,并使用
SomeInterface
返回类型是实现这一点的唯一方法?

我认为(如果我正确理解了您的问题)显式声明
成员的类型将执行您想要的操作,例如

interface SomeInterface

class Implementation : SomeInterface

class Test {
    val member: SomeInterface = Implementation()
}
更新:在问题更新后,澄清在测试类中
成员
应为
实现
类型,而不是
某些接口

我不认为没有成员变量就可以完成您试图做的事情,正如您在问题中所建议的那样。但是,如果您有一个基类来定义您的
成员
应该是什么,那么您可以做您想做的事情:

interface SomeInterface

class Implementation : SomeInterface

abstract class Super {
    abstract val member: SomeInterface
}

class Test : Super() {
    override val member = Implementation()  
    // declared as Implementation, but does correctly implement superclass which wants this to be a SomeInterface.
    // In this class, member is of type Implementation.
}

fun test() {
    val test1 = Test()
    val member1 = test1.member  // member1 is an Implementation object

    val test2: Super = Test()
    val member2 = test2.member  // member2 is a SomeInterface object
}

上面显示的是,您可以拥有一个
成员
,该成员在类中作为
实现
,但在类外作为
SomeInterface
可见。但是,只有当你在类外使用它时,你才把它作为超类的一个实例来使用,超类将
成员
定义为
SomeInterface

类型对不起,我更新了这个问题:它不是我想要的,因为在
测试
类中,I不能将
成员
视为
实现
类型,它肯定会使用早期绑定和协方差技巧,但问题是在没有继承和抽象方法声明的情况下进行升级。但无论如何,你已经证实这是不可能的。非常感谢。在类中,您没有使用该属性。您正在使用字段。我的意思是,您不是在调用不会编译IMO的
getSettings().setValue(…)
,而是在调用
settings.setValue(…)
您可以这样做,因为
settings
属于
MutableLiveData
类型,而
getSettings()
则不是。我和你在
LiveData
上有相同的用例,我使用的是
\u private
public
变量的组合,正如你在文章中所建议的。当然,我只是在说方便,如果我可以,例如,写一些类似
val someObject=Implementation()
get():SomeInterface