填充和排序列表<! - ?扩展T&S - >

时间:2012-09-21 05:20:06

标签: java generics

我正在制作一组自定义swing组件,它们实现了required标志或tabIndex等各种属性。我在尝试填充各种自定义组件的List时遇到问题,然后根据每个组件的tabIndex对列表进行排序。

我是如何尝试这样做的,方法是让我的组件实现一个名为Indexed的接口,该接口实现单个方法getIndex()。然后使用我的IndexedComparator进行排序。

我的课程:

索引:

public interface Indexed {
      public int getIndex();
}

IndexedComparator:

public class IndexedComparator implements Comparator<Indexed> {

    @Override
    public int compare(Indexed o1, Indexed o2) {
        return o1.getIndex() - o2.getIndex();
    }

}

WWTextField:

public class WWTextField extends JTextField implements Indexed, FocusListener {
    private boolean required;
    private int tabIndex;

   ...

    @Override
    public int getIndex() {
        return tabIndex;
    }
}

NewJFrame:

public class NewJFrame extends JFrame {
    List<? extends Component & Indexed> list = new ArrayList<>();
    IndexedFocusTraversalPolicy policy = new IndexedFocusTraversalPolicy();

    public NewJFrame() {
        initComponents();

        list.add(wWTextField1);
        list.add(wWTextField2);
        list.add(wWTextField3);
        list.add(wWTextField4);
        list.add(wWTextField5);
        list.add(wWFormatedTextField1);
        list.add(wWFormatedTextField2);

        Collections.sort(list);
        policy.populateComponents(list);
        this.setFocusTraversalPolicy(policy);
    }
}

编辑:我忘记发帖了解实际问题。为什么不执行我的

List<? extends Component & Indexed> list = new ArrayList<>();

工作?当我尝试编译时,我得到了这些错误:

NewJFrame.java:22: error: > expected  
NewJFrame.java:22: error: ';' expected  
NewJFrame.java:22: error: illegal start of type  

2 个答案:

答案 0 :(得分:0)

Comparator个实例不是“自动”的,您必须指定它们。我想你的意思是:

Collections.sort(list, new IndexedComparator());

答案 1 :(得分:0)

仅在声明类型参数的情况下允许约束(即class C< T extends I & J > {}interface E< T extends I & J > {}< T extends I & J > void f() {})。

因此,您将减少为交叉类型名称。这个非特性是让我误解Java的许多事情之一。

我认为NewJFrame中的T extends Component & Indexed可能是通用的,而list可能是List< T >类型。在某些情况下,类型推断可以让客户端代码避免指定特定类型。