【问题标题】:Type safety with JCombobox on Java 7在 Java 7 上使用 JCombobox 进行类型安全
【发布时间】:2011-11-10 09:35:08
【问题描述】:

我无法摆脱 java7 中的一个新类型安全警告。

我定义了以下 JCombobox 对象

private JComboBox<Integer> combobox_current_year;

还有构造函数

combobox_current_year = new JComboBox(options.getList_years().toArray());

Java 7 现在给了我以下警告:

类型安全:类型 JComboBox 的表达式需要取消选中 转换为符合 JComboBox

改代码后

combobox_current_year = new JComboBox<Integer>((Integer[]) options.getList_years().toArray());

我得到以下异常:

线程“AWT-EventQueue-0”中的异常 java.lang.ClassCastException: [Ljava.lang.Object; 不能转换为 [Ljava.lang.Integer;在 jamm.gui.FinanzmanagerGui.mainWindow(FinanzmanagerGui.java:123) 在 jamm.StartJamm$1.run(StartJamm.java:43) 在 java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251) 在 java.awt.EventQueue.dispatchEventImpl(EventQueue.java:705) 在 java.awt.EventQueue.access$000(EventQueue.java:101) 在 java.awt.EventQueue$3.run(EventQueue.java:666) 在 java.awt.EventQueue$3.run(EventQueue.java:664) 在 java.security.AccessController.doPrivileged(Native Method) 在 java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 在 java.awt.EventQueue.dispatchEvent(EventQueue.java:675) 在 java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211) 在 java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128) 在 java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117) 在 java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113) 在 java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105) 在 java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

【问题讨论】:

    标签: java swing jcombobox java-7


    【解决方案1】:

    问题是toArray() 方法返回一个类型为Object[] 的对象,它与Integer[] 完全不同(因此导致转换失败)。您必须将不同类型的数组传递给toArray(…) 才能解决该问题。从列表中取出数组的最有效方法是:

    List<Integer> tmp = options.getList_years();
    combobox_current_year = new JComboBox<Integer>(
            tmp.toArray(new Integer[tmp.size()]));
    

    我使用一个临时变量来保存列表,因为我想预先调整数组的大小,以便可以将值复制到其中。传入一个较短的数组(例如长度为 0)也可以,但会导致发生额外的分配。 (您可以通过将长度为零的数组保留在 private static 字段中来使其工作;它实际上是不可变的,因此您可以在没有不良后果的情况下共享它。但我更喜欢预先调整大小,因为这样可以减少课堂级别的混乱.)

    【讨论】:

    • 使用toArray时不需要指定列表的大小。使用 tmp.toArray(new Integer[0]) 就足够了,因为传入的参数用于导出返回值的正确类型信息。
    • @MarkRotteveel 否,如果数组足够长 (&gt;= size()),集合将填充它
    • @ratchetfreak 我不知道。我仍然认为创建 0 大小的数组更简单,因为这样您就不需要自己查询大小:)
    • @Mark:我有时会这样做,但如果你不保留那个零长度数组,这种方法会更快。差异很小。
    【解决方案2】:

    尝试做

    combobox_current_year = new JComboBox<Integer>(options.getList_years().toArray(new Integer[0])); 
    

    集合框架的 toArray 总是返回一个 Object[] 如果你想要一个特定的数组类型你需要提供一个

    【讨论】:

      【解决方案3】:

      我猜这意味着options.getList_years() 返回一个List&lt;?&gt;

      这意味着你需要从 Object[] 转换为 Integer[],这必须通过复制操作来完成。

      Object[] years = options.getList_years().toArray();
      new JComboBox(Arrays.copyOf(years, years.length, Integer.class));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-20
        • 2018-10-02
        • 1970-01-01
        • 1970-01-01
        • 2013-05-17
        相关资源
        最近更新 更多