【问题标题】:Referring to any of the subclasses of a particular superclass in Java在 Java 中引用特定超类的任何子类
【发布时间】:2011-09-05 00:32:33
【问题描述】:

好的,伙计们,这是一个我自己无法完全解决的简单问题。非常感谢任何帮助!

  • 假设我有一个抽象类Superclass,我从中派生出 子类Subclass1Subclass2
  • 假设我有另一个 myClass 类,带有 myField 字段。我想说明 myField 的类型应该是 Superclass 的固定子类的 List,即 List<Subclass1>List<Subclass2>

我应该如何输入myField List<Superclass> 不起作用,因为这样的列表理论上可以包含Subclass1 的组合 Subclass2 对象...我真正在这里寻找的是List<subclass(Superclass)>。那甚至存在吗?你会怎么做呢?

再次感谢您的帮助!

纪尧姆

【问题讨论】:

  • 你会在哪里指定它是哪个类型?
  • 好吧,如果你只想要Subclass1 类型的类,你必须准确地指定它。请注意,List<Superclass> 是不正确的(除非 Superclass 可以自己实例化),如果您想要 Superclass 的所有子类,它应该是 List<? extends Superclass> - 但由于这不是您想要的,所以这并不重要..

标签: java list subclass superclass


【解决方案1】:

你需要使用泛型。

class MyClass<S extends SuperClass> {
  private List<S> myField;
  ...
}

希望这会有所帮助。

【讨论】:

  • 泛型仅在编译时强制执行。如果他希望班级接受任何一个,只要它们都相同,他就需要运行时检查。
  • 如果将运行的所有代码都使用泛型,@jiggy 编译时检查就足够了。他还希望列表一次只包含一个子类的实例。
  • 泛型正是我正在寻找的。谢谢!
【解决方案2】:

你可以使用bounded wildcard:

class MyClass {
    List<? extends Superclass> myField;
}

如果这样做,则无法在myField上调用add等方法(嗯,可以,但只能传入null

另一种选择是泛型类:

class MyClass<T extends Superclass> {
    List<T> myField;
}

【讨论】:

    【解决方案3】:

    您寻找的实际上是运行时检查,您可以做的是,将 myField 声明为,

    private List<Superclass> myField
    

    并有一个设置器来进行运行时验证;

    public addMyField(Superclass field){
    
       if (field instanceof Subclass1 || field instanceof Subclass1){
         myField.add(field);
       }
    }
    

    【讨论】:

    • 这不是 OP 想要的。
    • @Prabath guidupuy 希望在他的列表中只包含其中一个子类的实例
    • 你不能在编译时这样做。它应该是运行时检查,以找出您需要的确切类型。这就是答案所暗示的。
    • 如果您需要确切类型的非最终类,则需要运行时检查,但这不是最初的问题!
    猜你喜欢
    • 2015-03-09
    • 2013-06-07
    • 2012-09-10
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多