以这种方式创建通用对象数组是否有任何缺点或性能问题?
QueryObjects instances[] = (QueryObjects<String,String,String>[]) new Object[10];
编辑:我甚至在想是否可以依赖于此: -
QueryObjects instances[] = new QueryObjects[10];
这样做的主要原因是,我不希望将通用修复为<String,String,String>
,因为有时它对于某些数组元素也可能像<Integer,Integer,Integer>
一样。所以我想把它作为运行时选择。由于这主要是针对应用程序的内部工作而不是任何客户端的输入,也许我不应该面临错误输入的危险。
答案 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;
}