2012-08-27 218 views
4

我有一個奇怪的問題(在我的腦海裏)。我目前正在爲自定義渲染器創建一個自定義JComboBoxModel,我需要一些自定義功能我還不確定如何處理,稍後我會發布。無法將ArrayList <String>轉換爲ArrayList <java.lang.String>

無論如何,因爲標題建議我得到一些類型錯誤。

下面是類(電流)代碼:

package miscclasses; 
import java.util.ArrayList; 
import javax.swing.AbstractListModel; 

public class CustomComboBoxModel<String> extends AbstractListModel<String> { 
    /** 
    * Contains a list of row indexes that shouldn't be displayed. 
    */ 
    private ArrayList<String> alreadySelectedIndexes; 
    /** 
    * The comboBoxes selected index. 
    */ 
    private int selectedIndex=-1; 
    /** 
    * Contains a list of values in this model. 
    */ 
    private ArrayList<String> vals; 
    /** 
    * Creates an empty CustomComboBoxModel. 
    */ 
    public CustomComboBoxModel() { 
     this.alreadySelectedIndexes=new ArrayList<>(); 
     this.vals = new ArrayList<>(); 
    } 
    /**Creates a CustomComboBoxModel with the values passed in. 
    * 
    * @param values the row values. 
    */ 
    public CustomComboBoxModel(ArrayList<String> values) { 
     this(); 
     this.vals.addAll(values); 
    } 

    public CustomComboBoxModel(ArrayList<String> values, ArrayList<String> alreadySelected) { 
     this(values); 
     this.alreadySelectedIndexes.addAll(alreadySelected); 
    } 

    public CustomComboBoxModel(ArrayList<String> values, ArrayList<String> alreadySelected, int selectedIndex) { 
     this(values, alreadySelected); 
     this.selectedIndex=selectedIndex; 
    } 

    public CustomComboBoxModel(ArrayList<String> values, ArrayList<String> alreadySelected, String selectedValue) { 
     this(values, alreadySelected); 
     if(!this.vals.isEmpty()) { 
      //this.selectedIndex = Misc.containsI(this.vals, selectedValue); 
     } 
    } 

    @Override 
    public int getSize() { 
     return this.vals.size(); 
    } 

    @Override 
    public String getElementAt(int i) { 
     return this.vals.get(i); 
    } 

    public boolean isRowSelected(int i) { 
     return ((!this.alreadySelectedIndexes.contains(Integer.toString(i)))?false:true); 
    } 
} 

我收到的錯誤是在第55行,其中我嘗試獲得選定的值的索引。這是構造函數中的註釋行,它接受兩個ArrayList列表和一個String值。錯誤指出「沒有合適的方法來處理containsI(java.util.ArrayList,String)方法miscclasses.Misc.containsI(java.util.ArrayList,java.lang.String)不適用」。

據我所知,String和java.lang.String是完全相同的東西。因此,我似乎無法弄清楚可能會導致這個問題的原因,並認爲我會問那些更熟悉Code-fu的人比我更熟悉。

作爲參考,Misc.containsI(ArrayList,String)代碼是在這裏:

/** 
* Finds the index of value Target. Returns -1 if this ArrayList doesn't contain Target. 
* @param a   ArrayList of Strings a. 
* @param target Value to find. 
* @return   Index of target if found; Else returns -1. 
*/ 
public static int containsI(ArrayList<String> a, String target) { 
    for (int i = 0; i < a.size(); i++) 
    { 
     if(a.get(i).equalsIgnoreCase(target)) 
      return i; 
    } 
    return -1; 
} 

我也奇怪接收我isRowSelected以下警告(int i)以功能: 「Suspcious調用java.util.Collection.contains:預期String類型,實際String類型」。

同樣,我不明白爲什麼我會收到警告。這似乎是完全有效的代碼,我以前也做過類似的代碼。任何幫助這個奇怪的警告和錯誤,將不勝感激。

編輯:更改聲明,所以它讀取:

public class CustomComboBoxModel extends AbstractListModel<String> 

代替:

public class CustomComboBoxModel<String> extends AbstractListModel<String> 

似乎已經擺脫了警告和錯誤的。我不明白爲什麼然而,因爲我有一個自定義JList模式聲明爲:

public class CustomListModel<String> extends javax.swing.DefaultListModel<String> 

在同一個包沒有錯誤。

回答

11

在這一行已聲明的類型參數調用String

public class CustomComboBoxModel<String> extends AbstractListModel<String> { 
           ^^^^^^ 

當您稍後查閱String編譯器認爲你的意思是類型參數,而不是java.lang.String類。

此處的解決方案是刪除類型參數,因爲您不需要類型參數。


以下簡化的例子給出了一個類似的錯誤消息:

class Foo<String> 
{ 
    String s = ""; // error: incompatible types 
} 

完整的錯誤信息是:

 
Main.java:3: incompatible types 
found : java.lang.String 
required: String 
    String s = ""; 
      ^

網上看到它:ideone

+0

提的是有一定道理,給出了錯誤和警告的措詞。奇怪的是,我沒有這樣的類,但是在這個包中的其他類中嘗試這樣做會導致相同的錯誤。 但是,不管出於何種原因,將類聲明從「public class CustomComboBoxModel extends extends AbstractListModel 」改爲「public class CustomComboBoxModel extends AbstractListModel 」 我不太明白爲什麼會這樣。然而,感謝你的幫助,因爲如果你沒有提到這點,我從來沒有嘗試過。編輯:你知道爲什麼改變,擺脫了這個問題? – Legowaffles

+0

@Legowaffles:我現在看到它。你創建了'String'作爲類的類型參數。你應該得到至少一半的解決這個問題的功勞! –

+0

這和我上面提到的JList模型有什麼不同,除了擴展Default模型?我不太瞭解這種差異。有關更多詳細信息,請參閱我的主文章編輯。 – Legowaffles

相關問題