有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何检索放入DefaultListModel的对象类型?

我希望我能很好地解释我在这里想要什么。检索放入DefaultListModel的对象类型时遇到问题

public class HiddenIntegerFieldListItem {

    private final String displayedField;
    private final int    hiddenField;

    public HiddenIntegerFieldListItem( String dField, int hField ) {
        displayedField = dField;
        hiddenField    = hField;
    }

    public String getDisplayedField() { return displayedField; }
    public int getHiddenField() { return hiddenField; }

    @Override
    public String toString() { return displayedField; }

}

。。。在其他地方

DefaultListModel listModel = new DefaultListModel();
listModel.addElement( new HiddenIntegerFieldListItem( "The String", 4) );
jList.setModel( listModel );

问题是,当我去检索它时,它告诉我它不能将其转换为字符串。 但我放了一个物体。。。那它为什么不把我的东西还给我? 编译器一切正常。。。直到我把我的物体从模型中拿出来。 它给我一个不兼容的类型警告,只在我执行以下操作时才查找字符串

HiddenIntegerFieldListItem hif = 
     (HiddenIntegerFieldListItem) jList.getModel().getElementAt( 0 );

我错过了什么?为什么它只想给我一个字符串而不是我的对象? 它当然接受了对象,并且对象中有一个toString()方法。我得到的只是

不兼容类型:字符串无法转换为HiddenIntegerFieldListItem

我被难住了。准备放弃在列表框中存储主键和项目描述,而是编写一大堆意大利面代码,这看起来很愚蠢有人知道我在这里做什么,知道我做错了什么吗?模型不能再存储对象了吗?只有弦吗


共 (1) 个答案

  1. # 1 楼答案

    一般来说,在编译时,当您从数据结构中提取项时,它不会查看输入时的类型(例如,它实际上是什么),它要查找的是该方法的签名

    如果数据结构上get方法的方法签名返回一个对象,那么就编译器而言,从数据结构中提取的所有内容都是一个对象

    现在您知道实际的类是一个HiddenIntegerFieldListItem,所以您需要做的是告诉编译器它就是这样的,在使用它之前将它强制转换为该类型

    (如果你把它转换成错误的类型,编译器会允许你——然后你会在运行时得到一个虚拟的spit。)

    为了确保不会将某些内容强制转换为错误的类型,可以使用instanceof运算符


    另一件需要注意的事情是,通过铸造某些东西,你并没有改变它的本质,而是改变了它在代码其余部分的外观。因此,对象的接口或定义有特定的方法,但HiddenIntegerFieldListItem的接口或定义有不同的方法,但所有的对象方法仍然可用

    所以在这里,对象代表一个特定的最小功能,当你转换它时,你说它有更多的功能,你可以合法地将它转换到它的超类层次结构中的任何东西。但不能将其强制转换为其实际类的子类,因为该子类可能包含对象实际上没有的数据和方法