Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是列表<;列表<;字符串>&燃气轮机;集合的实例<;收藏<;T>>;?_Java_Generics_Collections_Covariance - Fatal编程技术网

Java 是列表<;列表<;字符串>&燃气轮机;集合的实例<;收藏<;T>>;?

Java 是列表<;列表<;字符串>&燃气轮机;集合的实例<;收藏<;T>>;?,java,generics,collections,covariance,Java,Generics,Collections,Covariance,我编写了这个方便的通用函数,用于将集合集合转换为单个集合: public static <T> Set<T> makeSet(Collection<Collection<T>> a_collection) { Iterator<Collection<T>> it = a_collection.iterator(); Set<T> result = new HashSet<T>();

我编写了这个方便的通用函数,用于将集合集合转换为单个集合:

public static <T> Set<T> makeSet(Collection<Collection<T>> a_collection) {
    Iterator<Collection<T>> it = a_collection.iterator();
    Set<T> result = new HashSet<T>();
    while (it.hasNext()) {
        result.addAll(it.next());
    }
    return result;
}
公共静态集makeSet(集合a_集合){
迭代器it=a_集合。迭代器();
Set result=new HashSet();
while(it.hasNext()){
result.addAll(it.next());
}
返回结果;
}
然后我试着称之为:

    List<List<String>> resultLists = ... ;
    Set<String> labelsSet = CollectionsHelper.makeSet(resultLists);
列表结果列表=;
Set-LabelSet=CollectionHelper.makeSet(结果列表);
我收到了以下错误:

<T>makeSet(java.util.Collection<java.util.Collection<T>>) in CollectionsHelper 
cannot be applied to (java.util.List<java.util.List<java.lang.String>>)
CollectionHelper中的makeSet(java.util.Collection) 无法应用于(java.util.List) 现在,
列表
是一个
集合
,而
字符串
是一个
T
。那么为什么这不起作用,我该如何修复它呢?

不,它不起作用

我会将声明更改为

public static <T> Set<T> makeSet(Collection<? extends Collection<T>> a_collection) {
    ....
}

公共静态集makeSet(集合您的签名应该是:

public static <T> Set<T> makeSet(Collection<? extends Collection<T>> coll);
但随后按如下方式调用此方法:

List<List<String>> outside = new LinkedList<List<String>>();
makeSet(outside); //actually this line will not compile!
List<String> oops = outside.get(0); //oh dear - it's a HashSet

这是一个更一般化问题的专门版本,“一个
集合
是一种
集合
?”

答案是否定的(也许令人惊讶)

<> P>在C++上下文中,推理是很好的。这是一个一般的面向对象的问题,所以同样的一般推理适用。

例如,考虑一个替换的宇宙,其中<代码>集合<代码>是一种<代码>集合<代码>。在这个宇宙中,你可以做这样的事情:

Collection<Circle> circles = new Collection<Circle>();
Collection<Shape> shapes = circles; // OK, we're in an alternate universe
shapes.Add(new Circle()); // OK, we're adding a circle to a collection of circles
shapes.Add(new Square()); // Asplode!  We just added a square to a collection of circles.
Collection circles=新集合();
集合形状=圆;//好的,我们在另一个宇宙中
shapes.Add(new Circle());//好的,我们正在将一个圆添加到一组圆中
shapes.Add(new Square());//Asplode!我们刚刚在一组圆中添加了一个正方形。
当正方形(一种形状)被添加到形状集合(实际上是圆的集合)时会发生什么?没有好的答案


同样的推理也适用于
集合
集合
集合
不是一种
集合
,因为它不适用于
集合
队列
可以添加到集合集合中,但不能添加到
列表
的集合中c静态集makeSet这是他带领java 1开发的一种东西,用来简化所有正在发生的愚蠢的C++模板。你添加了5层复杂的东西来避免从一组对象到一组特定实例的一个愚蠢的投射。如果你发现你到处乱扔,使代码变得丑陋,那就好了。ally我打赌这种情况大约每500k行代码中就发生一次。是的,是的,我们可以找到这些技术细节,这很好,但是当你开始走这条路的时候,你的代码真的变得更易于维护了吗?

我几乎不想给出正确的答案,因为它太难看了,但是因为三个最重要的答案都没有提到这一点,我觉得很有竞争力内尔

public static <T> Set<T> makeSet(
    Collection<? extends Collection<? extends T>> coll)
公共静态集makeSet(

收集三个答案导致了进展,但这一个是最完整的。我将很快调查“?扩展T”概念。结果我已经调查了:。多么尴尬。与你的问题完全无关,我很可能会使用“展平”这个词在一个实现此功能的方法的方法名中。Alex,仅供参考,我们拒绝了Iterables.concat()的扁平化方法,因为它可以很容易地解释为将N个级别的深度平坦化,而不仅仅是2个级别。不要犹豫,告诉我们您的真实想法。@Greg不是自以为是的,这可以使代码的某些部分更干净。我只是真的希望OP真正考虑的是首先让他的代码具有可读性,然后优化它以避免在nec时强制转换增加泛型的全部要点(在从其他地方有效地从C++样式语法中删除)之后是为了清理大量的重复铸造。首先删除它并创建所有对象的目的是删除所有不必要的和重复的模板。我们需要尝试清楚我们为什么要在代码中执行这些操作。如果集合是一个概念而不是基类,那么所有这些都可以避免。或者如果我可以告诉编译器一个_集合是const。我更喜欢前者。但我的代码没有向原始集合添加任何内容;它只是将数据转换为一个单独的数据结构。这很好地解释了为什么我通常避免继承。您的代码没有更改它,但这并没有改变conc由于这个原因,ept无效。集合不能替代集合,因此它不是集合的子类。这是贯穿多种语言的基本OO理论。它比您的单个示例更基本。
boolean addAll(Collection<? extends T> coll)
Collection<Circle> circles = new Collection<Circle>();
Collection<Shape> shapes = circles; // OK, we're in an alternate universe
shapes.Add(new Circle()); // OK, we're adding a circle to a collection of circles
shapes.Add(new Square()); // Asplode!  We just added a square to a collection of circles.
public static <T> Set<T> makeSet(Collection<? extends Collection<T>> a_collection) {
    Iterator<? extends Collection<T>> it = a_collection.iterator();
    Set<T> result = new HashSet<T>();
    while (it.hasNext()) {
            result.addAll(it.next());
    }
    return result;
}
public static <T> Set<T> makeSet(
    Collection<? extends Collection<? extends T>> coll)