Kotlin无法访问受保护的抽象方法
我的课程结构如下:Kotlin无法访问受保护的抽象方法,kotlin,Kotlin,我的课程结构如下: 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' } 我遇到一个异常K
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:无法访问'm':它在'Abstr'中受保护。
这有点令人困惑,因为相同的结构对java是合法的
据
- 受保护-仅在该类中可见+在子类中也可见李>
abstract class Abstr{
protected abstract fun m()
}
class Child : Abstr(){
private val subChild: Abstr = Child()
override fun m() {
subChild.m() // Compiles fine
}
}
在上创建问题
或是写得松懈
当前行为是设计的 通过调用
subChild.m()
您试图从对象外部访问absr
的实例,因此protected
access阻止您这样做
让我给你举个简单的例子来澄清这个问题
protected
ParentCl
的乐趣。它会很好用的变量。它会很好用的
受保护的乐趣。这是行不通的
受保护的更改为内部的或公共的
private val subChild=child()
注意:如果您将使用ParentCl的其他子类中的m(),则需要扩大子类中的可见性范围:
public override fun m(){…}
这是设计行为
Kotlin中的受保护修饰符类似于Java,但有额外的限制
受Java保护:
- 对继承可见
- 在包中可见
- 对继承可见
class Child : Abstr(){
private val subChild: Abstr = Child()
override fun m() = subChild.m() //Trying to access not inherited method
}
当我们试图从另一个包访问受保护的成员时,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团队的问题追踪器中有答案:
受保护-与private+相同,在子类中也可见
abstract class BaseActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(getLayoutResId())
}
protected open fun getPageTitle() = SpannableString(getString(R.string.app_name))
}
在你们班
class EditProfileActivity : BaseActivity() {
override fun getPageTitle(): SpannableString = SpannableString(getString(R.string.edit_profile))
}
有关更多详细信息,请参阅文档
您使用了
subChild:Child=Child()
,这就是为什么“一切正常”不是因为Kotlin的bug。原始代码明确定义了类型:subChild:absr=Child()
@Val噢,忘了往回改,反正代码编译得很好。谢谢您的编辑。@icarumbas您的代码无法编译。和我一样的错误
class EditProfileActivity : BaseActivity() {
override fun getPageTitle(): SpannableString = SpannableString(getString(R.string.edit_profile))
}