【问题标题】:How to Cast a Vector<ObjectA> to Vector<ObjectB> in Java?如何在 Java 中将 Vector<Object> 转换为 Vector<Object>?
【发布时间】:2011-03-15 08:53:49
【问题描述】:

我正在使用带有自定义类对象的 JComboBox,equals 方法被覆盖,并且非常深入地集成到代码中。

问题是如果两个对象在一个JComboBox下拉列表中是相等的,那么如果一个被选中,所有被选中,并且get selected index返回-1。

有没有办法将Vector&lt;ObjectA&gt; 转换为Vector&lt;ObjectB&gt;? 我试过了

Vector<Clas_2> v_temp=(ca.courses.get(i).classes);

Vector<Clas_3> v_temp=(ca.courses.get(i).classes);

其中Clas_2Clas_1 的父级,Clas_3Clas_1 的扩展,但它们都不能编译。

我只需要 JComboBox 不使用覆盖的 equals 方法。

*注意我知道我可以将每个单独的元素转换成一个新数组,但我宁愿有一个内存效率更高的解决方案。

【问题讨论】:

    标签: java vector casting jcombobox


    【解决方案1】:

    更改您在代码中声明变量的类型不会更改调用 equals() 方法的内容。无论您将其投射到什么位置,它都将永远是被覆盖的。这就是多态性的工作原理。如果你想要不同的 equals 实现,你需要创建一个不同的类。

    【讨论】:

    • 如果改成Clas_2或Clas_3类型有一个eqauls方法总是返回false,那它不会使用当前类型的equals方法吗?
    • 没有。它将始终使用底层类型的 equals 方法。强制转换变量实际上并不会改变它的基础类型,只是它在您的代码中显示的内容。类型是断言类型必须“至少”是什么的一种方式。实际情况可能完全不同。我建议阅读 polymorphism 以及它如何融入 Java 和 OO 编程。
    • 我想我已经用 C++/C 编码太久了,你可以很容易地切换类型。有没有办法让 JComboBox 不使用 equals 方法?
    • 这是不可能的,不。您需要做的是更改实际的基础类型。编写一个新类,您将引用 Clas_1Clas_2 等,但提供您想要的 equals 实现可能是一种有效的方法。我猜如果你不能在你拥有的类中实现一个准确的 equals 方法,那么它们可能不是首先放入你的 JComboBox 的正确类型。也许在你的每个类中发布你的 equals 实现?
    • 我认为最好的办法是让 for 循环遍历我的 Vector,并使用 toString() 添加每个 Clas_1。感谢您的帮助。
    【解决方案2】:

    不,不是没有类型不安全的。但是您可以将Vector&lt;Clas_1&gt; 转换为Vector&lt;? extends Clas_2&gt;,但这应该可以解决您的问题。

    由于Clas_2Clas_1 的父类,任何get 来自Vector&lt;Clas_1&gt; Clas_2 的实例,但你不能add 任何@987654329 @ 到 Vector&lt;Clas_1&gt;,因为并非所有 Clas_2 的实例都是 Clas_1 的实例。 extends 语法使这种区别。

    【讨论】:

    • 嗯,我试过了,它编译了,但它似乎仍然使用 Clas_1 中的 equals 方法,而不是 Clas_2(总是返回 false)
    • 其实并没有解决他的真正问题。再多的类转换都不允许他覆盖equals 行为。在 Java 中你不能那样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    • 2013-04-01
    • 1970-01-01
    • 2014-05-16
    • 2012-03-02
    • 1970-01-01
    • 2012-06-03
    相关资源
    最近更新 更多