2011-08-26 106 views
1

所以我一直在寻找答案,我只是不知道它是如何工作的。Java:如何初始化类型化对象列表?

我在尝试制作一个BloomFilter<String>对象的列表。

的布隆过滤器的类定义是:

public class BloomFilter<E> implements Serializable { ... 

<E>允许用户选择什么类型的元素正在进入所述过滤器。在我的情况下,我需要字符串。

在程序的其他地方,我需要4个BloomFilter<String>对象。

我的问题是:如何初始化以下行?

private static BloomFilter<String> threadedEncrpytionFilters[] = null; 
threadedEncryptionFilters = ??? 

这似乎与创建ArrayList列表类似?这也是可能的吗?

+0

你的问题有点不清楚......你想要一个这些对象的列表或数组? – Jon7

回答

4

看到有人alread回答了这个问题之后,我想删除这个答案,但我所作的评论看,人们仍然感到困惑所以这里有云:)

该规范明确指出,您要做的事是非法的。含义:

BloomFilter<String> threadedEncrpytionFilters[] = new BloomFilter<String>[4]; 

不会编译。你不能创建一个具体的泛型类的数组。当谈到仿制药,你只能在阵列存储:

  • 原始类型
  • 无界通配符parameteriezd类型

变通办法是你的问题是,如前所述,改变阵列的List<BloomFiler<String>>

如果考虑到Java在不同阶段(编译,运行时等)如何处理泛型类型,此行为实际上非常合理。了解到您会看到具体泛型类型的数组不会是类型安全的。这里有一个很好的阅读关于这个问题:http://www.angelikalanger.com/GenericsFAQ/FAQSections/ParameterizedTypes.html#FAQ104

+0

+1 - 很好的答案。 – Kal

1

考虑一下:

private static List<BloomFilter<String>> threadedEncrpytionFilters = 
    new ArrayList<BloomFilter<String>>(); 
2
List<BloomFilter<String>> list = new ArrayList<BloomFilter<String>>(); 
list.add(new BloomFilter<String>()); 
list.add(new BloomFilter<String>()); 
list.add(new BloomFilter<String>()); 
// ... and so on 
+0

完美!谢谢!我没有意识到你可以像这样嵌套类型参数。 – theangryhornet

+0

你也可以添加到你的答案如何实例和声明数组:[BloomFilter [] threadedEncrpytionFilters = new BloomFilter [100];' – Marcelo

+0

@Marcelo:这里的重点是你的代码不会编译。 –