繁体   English   中英

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

[英]How do I retrieve the Object type that I placed into a 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

我难住了。 准备放弃将主键与项目描述一起存储在列表框中,而是编写一大堆意大利面条代码,这看起来很愚蠢。 :D 任何人都看到我在这里尝试做的事情并知道我做错了什么? 模型不能再存储对象了吗? 只有字符串?

通常,在编译时,当您从数据结构中提取项目时,它不会查看您放入时的类型(例如,它实际是什么),它要查找的是该方法的签名。

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

现在您知道实际的类是一个 HiddenIntegerFieldListItem - 所以您需要做的是告诉编译器它是什么,通过在使用它之前将其转换为该类型。

(如果你将它转换为错误的类型,编译器会让你 - 然后你会在运行时得到一个虚拟的吐痰。)

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


另一件要注意的事情是,通过强制转换某些东西,您并没有改变它的本质,而是将其外观更改为其余代码。 所以Object的接口或定义有一定的方法,但HiddenIntegerFieldListItem的接口或定义有不同的方法,但所有的Object方法仍然可用。

所以这里的 Object 代表了某个最小的功能,然后当你投射它时,你说它有更多的功能,你可以合法地将它投射到它的超类层次结构中的任何东西。 但是你不能把它转换成它实际类的子类,因为那个子类可能有你的对象实际上没有的数据和方法。

好的,模拟工作。 问题是 netbeans 设计人员为我输入了 JList,用于字符串,而我不知道它会自动执行此操作。 一旦我从设计器工具的类型参数输入中删除它,一切都很好。 但这里是模型,对于任何想要在 JList 中的可见字符串旁边存储一个键的人。

public class Test {

    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; }
    }

    public void tryIt() {

        javax.swing.JList<HiddenIntegerFieldListItem> jList = new javax.swing.JList<>();
        javax.swing.DefaultListModel listModel = new javax.swing.DefaultListModel();
        listModel.addElement( new HiddenIntegerFieldListItem( "The String", 4) );
        jList.setModel( listModel );

        // all good up till there, then ... oh wait, it worked now! ???

        HiddenIntegerFieldListItem hif = jList.getModel().getElementAt( 0 ); 
        System.out.println( hif.getHiddenField() + "" ); //Yay! It works! Output: 4
    }

    public static void main (String args[] ) {
        Test  t = new Test();
        t.tryIt(); 
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM