【发布时间】:2018-07-08 20:33:31
【问题描述】:
我在使用通用抽象类扩展内部类时遇到问题。
我得到一个 Non-static field cannot be referenced from a static context,这很奇怪,因为类本身是静态的,不一定是字段值。
这基本上就是我所拥有的:
// AbstractFoo.java
public abstract class AbstractFoo extends FrameLayout {
// Some logic
}
// AbstractBar.java
public abstract class AbstractBar<T> {
int someNumber;
// Some logic
}
// Foo.java
public class Foo extends AbstractFoo {
// Some logic
// Foo.InnerFoo.java
public static class InnerFoo extends AbstractBar<InnerFoo> {
public InnerFoo() {
super.someNumber = 5; // Compiler error HERE
}
}
}
由于某种原因,我无法从InnerFoo 访问someNumber。据我了解,这不应该引起任何问题。顺便说一句,我正在扩展的类来自外部库。
这也都是在 Android 上完成的,最低 SDK 为 24。
感谢您的帮助!
【问题讨论】:
-
public class Foo extends Foo {??? -
@DontKnowMuchButGettingBetter 抱歉修复了它
-
someNumber 应该受到保护以通过子类访问它。此外,class X extends SomeGeneric
真的很奇怪,即使是合法的。 -
你发布的代码对我来说编译得很好。
-
除了可见性问题:您的代码违反了最重要的 OO 原则:信息隐藏/封装。没有其他类(甚至子类)不应该知道一个类如何存储它的属性。去这里的正确方法是将值作为 构造函数参数 传递给
AbstractBar并在AbstractBars 构造函数中分配它。
标签: java android inheritance