gpt4 book ai didi

Kotlin 无法访问 protected 抽象方法

转载 作者:IT老高 更新时间:2023-10-28 13:40:06 26 4
gpt4 key购买 nike

我有以下类结构:

abstract class Abstr{
protected abstract fun m()
}

class Child : Abstr(){
private val subChild: Abstr = Child()

override fun m() = subChild.m()// Error:(12, 18) Kotlin: Cannot access 'm': it is protected in 'Abstr'
}

我遇到了一个异常Kotlin: Cannot access 'm': it is protected in 'Abstr'

有点困惑,因为同样的结构对 java 来说是合法的。

根据kotlin docs

  • protected — visible inside this class only + visible in subclasses too;

是错误还是预期行为?

最佳答案

这是设计行为

Kotlin 中的 protected 修饰符类似于 Java,但有额外的限制。

受 Java 保护:

  • 对继承可见
  • 在包装中可见

在 Kotlin 中 protected :

  • 对继承可见

所以,根据有问题的代码,我们无法访问 protected 方法

class Child : Abstr(){
private val subChild: Abstr = Child()

override fun m() = subChild.m() //Trying to access not inherited method
}

当我们试图从另一个包中访问 protected 成员时,Java 中也有类似的限制:

// FILE: a/SuperClass.java
package a;
public class SuperClass {
protected void superFunction() {}
}

// FILE: b/ChildClass.java
package b;
public class ChildClass extends SuperClass {
void testFunction() {
((SuperClass) new ChildClass()).superFunction(); // ERROR: superFunction() has protected access in a.SuperClass
}
}

Kotlin 团队的问题跟踪器中有答案: https://youtrack.jetbrains.com/issue/KT-21048

关于Kotlin 无法访问 protected 抽象方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47015707/

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