在Java中有效地强制转换向量的元素

时间:2010-08-04 13:04:41

标签: java vector casting

是否有一种更有效的方式(最好是O(1)而不是O(n),但至少更快地输入)来对类型的矢量进行类型转换?

public Vector<String> typecastVector(Vector<Object> objects){
    Vector<String> strings = new Vector<String>();
    for(Object o : objects)
        strings.add((String) o);
    return strings;
}

注意

对于明显需要对Vector或其他Generic类进行类型转换的任何人:正如接受的回答者指出的那样,这可能是code smell,您可能需要refactor你的类层次结构中的代码。

具体,如果您还没有,则应考虑让使用所述Vector或其他Generic类的类本身使用Generics。当我在自己的代码中执行此操作时,我完全消除了代码中与上述函数类似的函数需求。

如果您从未在自己的代码中实现泛型,请查看上面的“泛型”链接。您可能会惊讶地发现它们可以用于从Vector类型转换中精确实现您认为需要的功能。

8 个答案:

答案 0 :(得分:6)

如果您要做的唯一事情是从Vector&lt; Object&gt;进行投射到Vector&lt; String&gt;,你可以做。你必须确保载体中的每个对象都是一个字符串!

显然,这不起作用:

    Vector<Object> objectVector = new Vector<Object>();
    Vector<String> stringVector = (Vector<String>)objectVector;

但你可以这样做:

    Vector<Object> objectVector = new Vector<Object>();
    Vector typelessVector = objectVector;
    Vector<String> stringVector = (Vector<String>)typelessVector;

你会得到一些警告,但代码应该可以正常工作。

如前所述,这确实感觉像代码味道。

答案 1 :(得分:3)

如果您肯定想要创建一个包含N个引用副本的新独立集合,那么很难看出如果没有像写时复制支持那样可能是O(1)。

您是否发现实际是您代码中的性能瓶颈?你有没有理由使用Vector代替ArrayList

答案 2 :(得分:2)

如果您对此有所了解,您将不会理解如果必须转换数组的每个元素,您将始终以O(n)结束。

由于编译器无法事先知道对象向量中的所有对象是否都是字符串,因此不能直接转换向量,而只能逐个元素。

答案 3 :(得分:1)

这确实是最好的方法。

为了将n元素投射到String,您需要“处理”所有n个元素。这意味着运行时间的下限必须是O(n)

就打字而言,你已经完成了所有的工作。只需将该方法放在实用程序类中,并在需要时调用它。

答案 4 :(得分:1)

您可以编写一个包装类,在获取元素时按需执行转换。如果列表很大并且您希望在实际使用元素之前延迟性能损失,这可能有意义。另一方面,它会在每次访问时抛出每个元素,所以如果你要反复访问Vector的元素,这可能是一个坏主意。

在现有代码中,您也可以使用正确的容量构建Vector:

Vector<String> strings = new Vector<String>(objects.size());

这可能会提高效率,因为如果列表很大,它不必重复分配更多内存。

答案 5 :(得分:0)

你应该避免使用Vector&lt; Object&gt;首先,如果它'真的'是一个Vector&lt; String&gt;。对象在Java中是个错误。

你会得到一个编译器警告,并且有充分的理由,但是你可以首先采用转换为Vector的路线,然后转换为Vector&lt; String&gt;。这是O(1),非常愚蠢,因为你可以稍后得到一行代码,如String s = vector.get(1);给出ClassCastException,如果你对Vector&lt; Object&gt;不正确的话。只有包含字符串。

答案 6 :(得分:0)

您正在尝试使用运行时功能来删除编译时功能;泛型&lt; String&gt;无论如何都被剥夺了。

正如其他人所说,找到这个Vector的来源并将其定义为Vector&lt; String&gt;会好得多。这样你就可以使用你的编译器关于将“错误”对象放入Vector的警告,而不是在程序执行期间发现是否存在不良内容。

此代码存在的问题之一是,当您抓取Vector&lt; String&gt;时从您的Vector&lt; Object&gt;中,代码可能会失败。从调试的角度来看,转换步骤失败并不是很有用。在插入步骤失败会好得多,因为那样你就有机会立即对这个问题做出反应,而不是让它潜伏在代码的其他部分发现。

我知道你关心打字速度;但这是一个奇怪的指标。不转换东西总是更快,因为它首先是正确输入的;并且,打字速度不应该被优化,因为它通常是以牺牲可读性,正确的代码结构,合理的设计等为代价的。如果你必须多次输入一些东西,也许是时候制作一个抽象的基类了,或使用其他方法允许编写所需代码的一份副本。

答案 7 :(得分:0)

如果您说Vector包含Object个元素,则它应该仅包含 Object个元素:

Vector<String> stringVector = new Vector<String>();
Vector<Object> objectVector = stringVector; // ERROR

Vector所包含的内容任何源自 Object的内容都使用以下语法:

Vector<String> stringVector = new Vector<String>();
Vector<? extends Object> objectVector = stringVector; // OK