泛型类型数组的可能方法?

时间:2011-02-24 18:30:46

标签: java arrays generics

以这种方式创建通用对象数组是否有任何缺点或性能问题?

QueryObjects instances[] = (QueryObjects<String,String,String>[]) new Object[10];

编辑:我甚至在想是否可以依赖于此: -

QueryObjects instances[] = new QueryObjects[10];

这样做的主要原因是,我不希望将通用修复为<String,String,String>,因为有时它对于某些数组元素也可能像<Integer,Integer,Integer>一样。所以我想把它作为运行时选择。由于这主要是针对应用程序的内部工作而不是任何客户端的输入,也许我不应该面临错误输入的危险。

4 个答案:

答案 0 :(得分:2)

以这种方式创建它确实有一个缺点:你现在拥有的任何类型Object的数组都伪装成QueryObjects数组。如果其他人对同一个数组有引用(并且知道它是Object[]),那么他们可以在其中加入一些Object,例如String,当您尝试通过对数组的引用访问ClassCastException时,程序将抛出String。解决方案:像这样创建:

QueryObjects<String, String, String> instances[] = new QueryObjects[10];

答案 1 :(得分:2)

您的代码将在运行时生成ClassCastException

如果需要创建变量类型的数组(例如QueryObjects[]),则应创建类型QueryObjects<String, String, String>[]的数组并将其强制转换为T[],或将来投射到{{1}}。 ,使用反射:How to create a generic array in Java?

答案 2 :(得分:2)

“正义”的方式是

QueryObjects<?,?,?>[] instances = new QueryObjects<?,?,?>[10];

原始方式很好:

QueryObjects[] instances = new QueryObjects[10];

注意类型声明:

Type[] var

Type var[]

我不在乎为什么Java允许第二种语法,它仍然没有任何意义。

答案 3 :(得分:1)

这引出了一个问题“如果你使用泛型,为什么要使用数组而不是类型结构?”

为什么不为它创建一个类型,而不是试图实现QueryObjects[]并且做得不好?然后你可以添加你想要的任何方法。 Yay面向对象!

class QuerySet<O extends QueryObjects<A,B,C>> {
    O[] objects;
}