【问题标题】:Java method that takes only objects that inherit from super class仅接受从超类继承的对象的 Java 方法
【发布时间】:2015-09-26 16:15:52
【问题描述】:

我想在 Java 类中有一个方法,它允许我只传递从超类 f.e. 继承的对象:

我有容器超类Div:

package org.gwtbootstrap3.client.ui.html;
    public class Div extends ComplexWidget {
        public Div() {
            setElement(Document.get().createDivElement());
        }
    }

我想在NRowsXNColumns 类中使用Div 类及其子类:

public class NRowsXNColumns extends GenericLayout {
    public NRowsXNColumns(List<T extends Div> containers) {
        // Do something with each container that extends Div class
        for(T extends Div container: containers) {
            container.display();
        }
    }
}

不幸的是它没有编译。

【问题讨论】:

  • 你的编译错误是什么?
  • 很明显,T extends Div 不是有效的 Java。

标签: java generics inheritance typed


【解决方案1】:

您可以在泛型中限制类型,例如声明 List&lt;? extends Div&gt;,但在声明循环变量 container 时不能使用该符号:

for (Div container : containers) {
    container.display();
}

由于containers 中的所有对象都必须是DivDiv 的子类,因此它们都可以分配给简单声明为Div 的变量。

(在泛型方法中,您可以定义&lt;T extends Div&gt;,然后将列表声明为List&lt;T extends Div&gt;,但在这种情况下没有T 的此类定义。)

【讨论】:

  • 好的。循环澄清很棒。但是你给我的声明没有编译,我收到一个错误:Syntax error on token "extends", , expectedThe type parameter Div is hiding the type Div
  • 啊,抱歉,我从您的代码中复制了 T extends Div,但没有意识到 T 没有在那里定义。在这种情况下,您可以使用 ? 通配符。
【解决方案2】:

给你

class NRowsXNColumns extends GenericLayout {
    public <T extends Div> NRowsXNColumns(List<T> containers) {
        for(T container: containers) {
            // Do whatever with container
        }
    }
}

【讨论】:

  • 行不通。我的类NRowsXNColumns 不接受任何类型化参数T。另外,您没有将参数限制为扩展超类Div 的类。在你的例子中,它可以接受一切,正如我所理解的那样。我也不明白你为什么添加返回类型?
  • 嗯。你试过了吗?如果不建议尝试一下。泛型不需要在类级别定义。它们也可以声明为构造函数或方法级别。您在 之间看到的不是返回类型。但是一种指定泛型类型信息的方法。在代码 sn-p 中,我们指定 T 的列表必须是扩展分区的对象列表。
  • @masterdany88 &lt;T extends Div&gt; 在此代码中约束 T 就像你想要的那样。只是它并没有真正买多少,一个通配符就足够了。
【解决方案3】:

你为什么不直接使用 -

public NRowsXNColumns(List<Div> containers) {

现在您可以传递属于 Div 类或 Div 任何子类的对象列表

【讨论】:

  • 除非您传递的列表被声明为List&lt;Div&gt;,否则这将不起作用。
  • OP 想要传递一个 div 或 div 子类的对象列表。那么如果不是List&lt;Div&gt;,他将如何声明该列表。说的都是对的。但这如何使这个答案不正确?
  • 如果有一个名为FloatedDiv的子类,则完全有可能在OP的代码中某处存在List&lt;FloatedDiv&gt;,并且该列表无法传递给该方法。
  • 这没有意义,因为他想传递 Div 的任何子类和/或 Div 本身的列表。在那种情况下,他为什么要创建 List
  • 如果他已经在代码的其他地方因为某些其他原因创建了List&lt;FloatedDiv&gt;。它不一定是仅为传递给此方法而创建的列表。
猜你喜欢
  • 2011-05-26
  • 2018-08-23
  • 2011-10-17
  • 1970-01-01
  • 2012-01-09
  • 1970-01-01
  • 2015-03-07
  • 2021-05-04
相关资源
最近更新 更多