代码之家  ›  专栏  ›  技术社区  ›  nyarian

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

  •  0
  • nyarian  · 技术社区  · 7 年前

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

    val member = Implementation() ,但我想去 公众的 getter返回用键入的引用 SomeInterface Implementation SomeInterface 实施 例如。

    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 可变LiveData .

    我会说这听起来很自然,但科特林似乎不允许这样。我错过什么了吗?或创造 private val _private = Implementation() val _public: SomeInterface = _private SomeInterface 返回类型是实现这一点的唯一方法吗?

    2 回复  |  直到 7 年前
        1
  •  2
  •   Yoni Gibbs    7 年前

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

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

    更新 :问题更新后,在测试课中澄清 成员 应该是 Implementation SomeInterface

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

    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 .

    推荐文章