是否有一种更有效的方式(最好是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
类型转换中精确实现您认为需要的功能。
答案 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