【问题标题】:Extending a generic class into a static inner class将泛型类扩展为静态内部类
【发布时间】: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


【解决方案1】:

类中定义的字段没有显式访问修饰符,该修饰符将使用默认访问修饰符并限制同一包中类的可见性。

您应该将AbstractBar 中的字段设置为protected -

public abstract class AbstractBar<T> {
    protected int someNumber;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多