代码之家  ›  专栏  ›  技术社区  ›  Daniel Bingham

在Java中用一个带粗体的泛型将一个集合传递给一个列表

  •  2
  • Daniel Bingham  · 技术社区  · 16 年前

    我有一个数据类型,它包含一个集合和一个方法, List<? extends MyClass> . 数据类型具有 Set<? extends MyClass> . 我需要能够将这些东西从集合中移出并放入列表中。它进入列表的顺序并不重要,它只需要开始跟踪它,以便在显示时重新排序。可以说,将集合更改为数据类型中的列表在这里是不可能的。

    一开始看起来很容易。创建一个新方法,该方法采用一个集合而不是一个列表,将其更改为一个列表,然后将其传递给刚刚获取列表的旧方法。问题在于将集合更改为列表。

    public void setData(Set<? extends MyClass> data) {
        List<? extends Myclass> newData = ArrayList< /* What goes here? */ >();
        for(ConcordaEntityBean o : data) {
            newData.add(o);
         }
         setData(newData);
    }
    

    显然,我不能用通配符实例化数组列表,它会阻塞。我不知道那个时候的类型。有没有方法从数据中提取类型并将其传递给arraylist?我能举例说明一下吗 MyClass ?还有别的办法吗?

    3 回复  |  直到 16 年前
        1
  •  6
  •   danben    16 年前

    你不能用 MyClass 因为 newData 不一定是类型 List<MyClass> ,Java不支持协方差(即 S 延伸 T 并不意味着 ArrayList<S> 是一个亚型 ArrayList<T> )

    你能做的是:

    List<MyClass> newData = new ArrayList<MyClass>();

    现在,所有的 Set (保证是 类名 )可放入 新数据 .

    一般来说,通配符类型强制执行边界约束。你知道 Set<? extends MyClass> 是一个 集合 参数化为 某种类型 ,并且该类型从上到下由 类名 . 所以当你处理这些元素的时候 集合 你只能把他们当作 类名 物体。

        2
  •  1
  •   Kip    16 年前

    这样做是否有效?

    List<MyClass> newData = new ArrayList<MyClass>(data);
    setData(newData);
    

    ?

    甚至一条直线:

    setData(new ArrayList<MyClass>(data));
    
        3
  •  0
  •   Powerlord    16 年前

    我知道我对写作的掌握 generic methods 是不稳定的,但这似乎是可行的:

    public <T extends MyClass> void setData(Set<T extends MyClass> data) {
        setData(new ArrayList<T>(data));
    }