我正在開發一個 ComboBox(更多的是背景關系而不是實際意義),我想知道 Java 泛型中是否存在“或”運算子。現在,宣告看起來像這樣:
public class SComboBox<T extends ComboBoxItem> extends JPanel {
ComboBoxItem我為可以在 ComboBox 中使用的專案創建的界面在哪里。但是,我也想接受String作為一種型別,這似乎是一項艱巨的任務,因為:
String是一個final class所以沒有人可以擴展它。- 我不確定您是否可以輸入“|”之類的內容 (or) 運算子,或者直接指定一個可接受的類。由于是一個“和”運算子(
<T extends A & B>)我想到它會是有意義的“或”有(|)為好。
我的問題本質上是第 2 點。我可以在泛型中指定一個我想要接受和/或使用類似“|”的類嗎?如果沒有,是否有任何解決方法或者我應該放棄使用泛型的想法?
uj5u.com熱心網友回復:
泛型沒有“或”運算子,原因很簡單。
在開始時宣告型別的想法是允許您在類的實作中使用來自該型別的方法。
當您使用“與”運算子 ( extends A & B) 時,您知道無論傳遞給您的是什么物件,您都可以訪問A該類的任何方法以及B該類的任何方法。
但是如果它是一個“或”會發生什么?然后你被傳遞一個物件,它可以是一個ComboBoxItem允許你使用ComboBoxItem的方法,或者它只是一個字串,這意味著你不能使用任何這樣的方法。在編譯時,您不知道傳遞的是哪個物件,因此給出型別毫無意義。
“或”沒有幫助。如果您沒有使用物件中的任何方法,您也可以根本不使用extends。
這里真正的問題是你想要做什么,它可以應用于字串以及組合框專案,但不適用于其他任何東西。聞起來像是設計問題。
uj5u.com熱心網友回復:
簡而言之,這是不可能的。一個類不能從兩個介面之一繼承,因為無法確定實際實作了哪個類。
您可以實作一個字串包裝器,正如 JayC667 提到的,并讓它實作您的 ComboBoxItem 介面。我假設您無論如何都需要 ComboBoxItem 引入的一些特殊功能。
一些例子:
interface ComboBoxItem{
String getDisplayText();
default Color getBgColor(){
return Color.WHITE;
}
default Color getFgColor(){
return Color.BLACK;
}
default ImageIcon getIcon(){
return null;
}
default boolean useIcon(){
return false;
}
}
并有一個簡單的實作,它只需要字串輸入。
public class StringCbItem implements ComboBoxItem {
private final String text;
StringCbItem (String text){
this.text = text;
}
@Override
String getDisplayText(){
return text;
}
}
對于 ComboBox,我可能只使用默認的 JComboBox。您可以通過傳遞自定義 ListCellRenderer 實作來覆寫其顯示和呈現行為。
public class MyRenderer extends JLabel implements ListCellRenderer<ComboBoxItem> {
public MyRenderer () {
setOpaque(true);
}
public Component getListCellRendererComponent(JList<?> list,
ComboBoxItem value,
int index,
boolean isSelected,
boolean cellHasFocus) {
setText(value.getDisplayText());
setBackground(value.getBgColor());
setForeground(value.getFgColor());
if(value.useIcon()){
setIcon(value.getIcon());
}
return this;
}
}
這只是如何做到這一點的一些示例,僅作為起點!
您可以在此處進一步閱讀:
如何使用組合框
介面 ListCellRenderer
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/381619.html
下一篇:將字串變成變數名
