从单个对象的接口集合

时间:2013-05-01 08:47:43

标签: java generics collections casting

我的课程SampleClass正在实施接口ISampleInterface 方法需要Collection<ISampleInterface>作为参数,但在我的代码中我想传递单个SampleClass对象 我试图做一些演员:

Collection<ISampleInterface> col = 
   (Collection<ISampleInterface>) Arrays.asList(new SampleClass[]{sampleClassInstance});

但我得到了投射错误:

Cannot cast from List<SampleClass> to Collection<ISampleInterface>

任何想法如何在一个优雅的线上做到这一点?

4 个答案:

答案 0 :(得分:3)

您只需指定正确的泛型类型参数:

Collection<ISampleInterface> col =
        Arrays.<ISampleInterface>asList(sampleClassInstance);

请注意new SampleClass[] { ... }是不必要的,因为asList需要T...varargs),因此数组创建是隐式的。

更重要的是,你可以写:

Collection<ISampleInterface> col =
        Collections.<ISampleInterface>singleton(sampleClassInstance);

来自Collections.singleton javadoc:

  

返回仅包含指定对象的不可变集。返回的集合是可序列化的。

答案 1 :(得分:1)

您需要更改签名以使用Collection<? extends ISampleInterface>

答案 2 :(得分:1)

尝试在asList()调用中创建正确的数组类型:

Collection<ISampleInterface> col = 
   (Collection<ISampleInterface>) Arrays.asList(
       new ISampleInterface[] { sampleClassInstance });

然后,'优雅'号船已经驶向国际海事组织......

我也认为你不需要明确地转向(Collection<ISampleInterface>)。所以你应该成为

Collection<ISampleInterface> col = Arrays.asList(
   new ISampleInterface[] { sampleClassInstance });

在那里更优雅

答案 3 :(得分:-1)

错误的原因是java中的泛型不是类型协变。你可以在这方面阅读网上的教程。

您可以使用以下替代方法:

col.addAll(Arrays.asList(new SampleClass[]{sampleClassInstance}));