【问题标题】:Collection of interface from single object从单个对象收集接口
【发布时间】:2013-04-25 06:41:21
【问题描述】:

我有类SampleClass实现接口ISampleInterface
方法需要 Collection<ISampleInterface> 作为参数,但在我的代码中我想传递单个 SampleClass 对象。
我正在尝试进行一些选角:

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

但是我得到了转换错误:

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

任何想法如何在一条优雅的线路中做到这一点?

【问题讨论】:

  • 你不能只做Arrays.asList(new ISampleClass[]{sampleClassInstance})吗?

标签: java generics collections casting


【解决方案1】:

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

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

注意new SampleClass[] { ... } 是不必要的,因为asList 采用T... (varargs),所以数组创建是隐式的。

更重要的是,你可以写:

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

来自Collections.singletonjavadoc:

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

【讨论】:

    【解决方案2】:

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

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

    话说回来,“优雅”的船已经在 IMO 航行了……

    我也不认为您需要显式转换为(Collection&lt;ISampleInterface&gt;)。所以你的可能应该变成

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

    那里更优雅一点

    【讨论】:

    • 请参阅my answer 以获得更多优雅。
    • 是的,你是对的。我大部分时间都在使用 Guava,不知道 Collections.singleton() API,很高兴知道!
    • 是的 ImmutableSet.of(sampleClassInstance) 几乎是同义词。我知道一些 Guava 用户喜欢只使用不可变实现而不是 Collections' 空/单例实现以保持一致性。
    【解决方案3】:

    您需要更改签名以使用Collection&lt;? extends ISampleInterface&gt;

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多