2017-04-25 84 views
0

我在寫一個應用程序,我不得不使用foo.setDefaultRenderer(Object.class,new FooRenderer())。當程序運行時,它沒有達到我的預期。即只有字符串正確着色,而整數,短褲等沒有正確着色。我曾假設使用Object.class可以適用於所有類型。爲什麼需要使用Short.class和Integer.class才能讓Render正常工作?爲什麼Object.class不能捕獲所有?

編輯1:下面是被請求的代碼。應用程序本身現在工作,因爲我把下面四行,但我想了解爲什麼Object.class不會捕獲所有可能的類型。

foo.setDefaultRenderer(Integer.class, new FooRenderer()); 
foo.setDefaultRenderer(Short.class,new FooRenderer()); 
foo.setDefaultRenderer(String.class, new FooRenderer()); 
foo.setDefaultRenderer(Object.class, new FooRenderer()); 
+0

假設您分享您嘗試提出解決方案的代碼。 –

+0

@RajithPemabandu查看編輯 –

+0

什麼是'foo'?一個'JTable'?答案將取決於任何'setDefaultRenderer'的執行情況。 – Radiodef

回答

1

在這樣的問題,總是先來看看源代碼,例如:grepcode

public void setDefaultEditor(Class<?> columnClass, TableCellEditor editor) { 
    if (editor != null) { 
     defaultEditorsByColumnClass.put(columnClass, editor); 
    } 
    else { 
     defaultEditorsByColumnClass.remove(columnClass); 
    } 
} 

如果你這樣做,你會看到JTable使用一種叫做哈希表defaultEditorsByColumnClass持有這些渲染

transient protected Hashtable defaultEditorsByColumnClass; 

,它顯示並編輯單元格的內容對象的一個​​表,按照在TableModel接口中的getColumnClass中聲明的類索引。

並且類類型是此表的關鍵。由於Object與Short,String不同,所以您看到的行爲具有完全意義,因爲在這種情況下,Map的Class<?>鍵既不是協變也不是逆變,而是不變,

相關問題