gpt4 book ai didi

kotlin - 是否可以更改 Kotlin 的属性 getter 类型?

转载 作者:行者123 更新时间:2023-12-02 13:22:17 25 4
gpt4 key购买 nike

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

例如,在类声明中我有 val member = Implementation() ,但我想要 公众 getter 返回使用 SomeInterface 键入的引用假设 ImplementationSomeInterface 的子类型,而在类声明中,此类型将用作 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 的父类(super class)型),但在类内部可以将其用作 MutableLiveData .

我会说这听起来很自然,但似乎 Kotlin 不允许这样做。我错过了什么吗?或创建 private val _private = Implementation()val _public: SomeInterface = _private或使用 getter 语义和具有 SomeInterface 的修改名称实现自定义方法返回类型是实现这一目标的唯一方法吗?

最佳答案

我认为(如果我正确理解了您的问题)明确声明 member 的类型会做你想做的事,例如

interface SomeInterface

class Implementation : SomeInterface

class Test {
val member: SomeInterface = Implementation()
}

更新 : 在更新问题以澄清测试类 member 后应该是 Implementation 类型,而不是 SomeInterface ...

正如您在问题中所建议的那样,如果没有成员变量,我认为您无法完成您想要做的事情。然而,如果你有一个基类来定义你的 member应该是,你 可以做你想做的事:
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
}

上面显示的是您可以拥有 member在您的类里面可以使用 Implementation , 但在类外显示为 SomeInterface .但前提是,当你在类外使用它时,你将它作为定义 member 的父类(super class)的一个实例来使用。作为 SomeInterface 类型.

关于kotlin - 是否可以更改 Kotlin 的属性 getter 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53518583/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com