2012-09-21 97 views
1

我正在製作一組自定義擺動組件,這些組件可以實現各種屬性,如required標誌或tabIndex。試圖填充各個自定義組件的List,然後根據每個組件的tabIndex對列表進行排序時,我遇到問題。填充和排序List <?擴展T&S>

我如何做到這一點是讓我的組件實現一個名爲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 
+0

那麼問題是什麼? –

+0

奧普斯,對不起,我想這會有所幫助。爲什麼我沒有實現List?擴展Component&Indexed> list = new ArrayList <>();'工作? – user1686524

+0

@ user1686524你是什麼意思的「不工作」? –

回答

0

Comparator實例不是「自動」,則必須指定它們。我想你的意思是:

Collections.sort(list, new IndexedComparator()); 
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>的類型。在某些情況下,類型推斷可能會讓客戶端代碼避免指定特定的類型。

+0

你有這方面的參考嗎? –

+0

這是我的參考資料,儘管Java 7可能已經改變了一些東西: http://books.google.com/books?id=TTVu8A3K9ysC&pg=PA82&lpg=PA82&dq=constraints+on+type+parameters+java&source=bl&ots= WTd3PeVBbs&SIG = teaUNg0ig9_J3dv-qd5Qvx_ZFi0&HL = EN&SA = X&EI = gqdcUPaBBuaXiAKDxIG4BA&VED = 0CFgQ6AEwBQ#v = onepage&q =約束%20on%20type%20parameters%20java&F =假 –

相關問題