【问题标题】:Cannot convert ArrayList<String> to ArrayList<java.lang.String>无法将 ArrayList<String> 转换为 ArrayList<java.lang.String>
【发布时间】:2012-08-22 09:06:08
【问题描述】:

我有一个奇怪的(在我看来)问题。我目前正在为自定义渲染器中需要的一些自定义功能制作自定义 JComboBoxModel 我还不确定如何处理,稍后我会发布。

无论如何,正如标题所暗示的那样,我遇到了一些类型错误。

这是类(当前)代码:

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 列表和一个字符串值。错误指出“没有适合的方法 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) 函数中也奇怪地收到以下警告: “对 java.util.Collection.contains 的可疑调用:预期的字符串类型,实际的字符串类型”。

再次,我不明白为什么我会收到警告。它似乎是完全有效的代码,我之前也做过类似的事情。对于这个奇怪的警告和错误的任何帮助,将不胜感激。

编辑:将声明更改为:

public class CustomComboBoxModel extends AbstractListModel<String>

代替:

public class CustomComboBoxModel<String> extends AbstractListModel<String>

似乎已经摆脱了警告和错误。但是我不明白为什么,因为我声明了一个自定义 JList 模式:

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

在同一个包中没有错误。

【问题讨论】:

    标签: java swing arraylist jcombobox


    【解决方案1】:

    在这一行中,您声明了一个名为 String 的类型参数:

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

    当您稍后引用 String 时,编译器会认为您指的是类型参数,而不是 java.lang.String 类。

    这里的解决方案是去掉类型参数,因为你不需要类型参数。


    以下简化示例给出了类似的错误消息:

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

    完整的错误信息是:

    Main.java:3:不兼容的类型 找到:java.lang.String 必需:字符串 字符串 s = ""; ^

    在线查看:ideone

    【讨论】:

    • 鉴于错误和警告的措辞,提及确实有意义。奇怪的是,我没有这样的类,但是在这个包中的其他类中尝试会导致同样的错误。然而,无论出于何种原因,将类声明从“public class CustomComboBoxModel extends AbstractListModel”更改为“public class CustomComboBoxModel extends AbstractListModel”我不太明白为什么会这样。但是,感谢您的帮助,因为如果没有您提及,我永远不会尝试这样做。编辑:你知道为什么改变它摆脱了这个问题吗?
    • @Legowaffles:啊,我现在明白了。您创建了String 作为类的类型参数。解决这个问题,你应该至少得到一半的功劳!
    • 这和我上面提到的 JList 模型有什么区别,除了扩展默认模型之外?我不太明白其中的区别。有关详细信息,请参阅我对主帖的编辑。
    • @Legowaffles:这种语法本身并没有错——拥有一个名为String 的类型参数是完全有效的,在某些情况下它可以编译甚至运行没有问题。问题是如果你在类中有一些代码,比如String s = "";。然后你会得到一个类型错误,因为文字字符串具有真正的 java.lang.String 类型并且不能分配给你的 String 类型。
    • 嗯,如果我的理解是正确的,那么从我的自定义 JList 模型类中的 CustomListModel 中删除 可能是明智的,以尝试防止将来可能发生的问题。编辑:果然,在我的自定义 JList 模型中尝试类似的东西会导致同样的错误。非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 2011-08-20
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    • 2017-11-09
    • 2021-02-21
    相关资源
    最近更新 更多