【问题标题】:Java - for each cycle typingJava - 为每个循环键入
【发布时间】:2015-09-03 00:53:12
【问题描述】:

我的问题:如何让以下代码工作?

代码: for (CustomTab tab : tabPane.getTabs()) { ... }

或者在可能创建的类 customTabPane 中编写什么方法以使其成为兼容的对象类型。我在泛型中读到了一些关于 extends 的内容 - 例如:ObservableList<? extends something>

【问题讨论】:

  • 如果tabPane.getTabs() 重新调整CustomTab[] 或实现Iterable<CustomTab> 的东西,代码将起作用。

标签: java list inheritance foreach


【解决方案1】:

基本上你在谈论我认为的两件不同的事情。首先是 for each 循环。您可以将它用于实现Iterable 的任何类型,例如:

class CustomTab {};

class TabPane<T> implements Iterable<T> {

    @Override
    public Iterator<T> iterator() {
        ...
    }
}

public void main() {
    TabPane pane = new TabPane<CustomTab>();
    for (CustomTab i : pane) {
       ... 
    }
}

第二个主题是泛型。您可以将 TabPane 限制为仅为继承树定义。例如,如果您希望为 CustomTab 和派生类型构建 TabPane,您可以这样编码:

class TabPane<T extends CustomTab> implements Iterable<T> {

    @Override
    public Iterator<T> iterator() {
        ...
    }
}

所以这将是有效的:

class DerivedPane extends CustomTab{};
new TabPane<DerivedPane>();

但这不会:

class OtherPane{};
new TabPane<OtherPane>();

【讨论】:

  • 对不起,我不明白你的意思。我只学习了一年的 Java ...我想以某种方式从 JavaFX 中覆盖 TabPane 中的 getTabs 方法以获取返回类型 ObservableList&lt;CustomTab&gt;,但该方法是最终的,并且正在返回 ObservableList&lt;Tab&gt;。如何通过相对方式做到这一点?
  • 好的,所以这是一个完全不同的问题......正如你所说,这个方法是最终的,所以你不能覆盖它,你宁愿不想这样做。我真的不知道你为什么要在这里使用 foreach 构造......你总是可以这样做for (Tab tab: tabPane.getTabs()) { if (tab instanceof CustomTab) { /* your code here*/ }}
  • 对不起,你不明白我的意思。如何通过其他方式在循环中访问 CustomTab 方法:for (Tab tab : tabPane.getTabs()) { ((CustomTab) tab).stopFlash(); } 我认为不需要重新输入,而且我认为其他程序员的做法不同。
  • 我想我理解你,但我确实认为这是最好的方式,只要你使用 JavaFX API,你总是可以在 TabPane 周围编写一个包装器,但我真的认为它会是更糟糕的是,无论如何你都必须做演员......
  • 这个问题可能很有趣,但我想了很多。如果我从 Tab 重新键入 CustomTab 的构造函数,何时调用它?当我尝试将这段代码 System.out.println("some text"); 写入 CustomTab 构造函数时,它在从 Tab 重新键入到 CustomTab 期间从不打印任何内容。但是我怎样才能访问 CustomTab 未初始化的对象并调用它们的方法呢?我对此很困惑......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-30
  • 1970-01-01
  • 2014-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多