2011-02-24 34 views
0

以这种方式创建一个通用对象数组是否有任何缺点或性能问题?泛型类型数组的一种可能的方法?

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

编辑:我甚至在想,如果我能,而不是依靠这样的: -

QueryObjects instances[] = new QueryObjects[10];

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

+0

你没有完成任何演员。将不会执行类型检查以确保它是''。 – 2011-02-24 18:53:39

+0

谢谢乔纳森!我只是添加了一些更多的信息给我的问题..请有一个简短的看看.. – 2011-02-24 19:09:12

回答

2

以这种方式创建它有一个缺点:你现在有什么真正的Object伪装成一个数组QueryObjects。如果其他人提及同一阵列(并且知道它是Object[]),则他们可以将一些Object放入其中,例如,一个String,然后当您尝试通过引用数组来访问String时,程序将抛出ClassCastException。解决方案:像这样创建:

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

-1在Java中不能做任何一个。这两个都给你一个编译错误:'不能创建QueryObject的通用数组' – 2011-02-24 18:44:10

+0

@Jonathon我的坏 - 我一直在编程太多的C#。无论如何,提供未经测试的代码是sl;不驯的;对不起,谢谢你指出。我的更新的解决方案_is_测试...(我的关于'ClassCastException'的争论仍然是正确的,但我; _did_测试...) – 2011-02-24 18:50:44

+0

投票反过来。假设你不介意未经检查的警告,这将起作用。 Java泛型是非常糟糕的:( – 2011-02-24 18:52:13

2

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

您应该创建QueryObjects[]类型的数组,并将其转换为QueryObjects<String, String, String>[],还是将来,如果你需要创建一个变量类型的数组(例如,T[]),使用反射:How to create a generic array in Java?

1

它回避问题“如果您使用泛型,为什么要使用数组而不是类型结构?”

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

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

作为一个附注,我可能在'>'上有语法错误。目前我没有时间来测试它的语法准确性。 – corsiKa 2011-02-24 19:08:43

+0

谢谢glocoder!我只是试了一下..这种语法似乎工作 '类QuerySet {' 'O []对象;' '}' 这可以满足我在编辑中提到的需求。 。像这个数组的某些元素可以是,而其他元素可以像。 – 2011-02-24 19:38:46

+0

如果行为相同,那么可以。如果行为因Integer或String而不同,则不应使用泛型。想想什么通用手段! – corsiKa 2011-02-24 21:06:51

2

“正义” 的方式是

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

原始的方法是蛮好的:

QueryObjects[] instances = new QueryObjects[10]; 

通知的类型声明:

Type[] var 

Type var[] 

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

相关问题