-1

Can some one help me to find out how to apply Type erasure/generics to make it work.

Set<? extends Object> ss = new HashSet<Integer>();
Set<? extends Object> sa = new HashSet<Integer>();
ss.addAll(sa);

Now it throwing compilation error, since it will check for type at compile time.

4

2 回答 2

1

首先你知道为什么它不起作用吗?

它们是两个单独的通配符。尽管它们看起来一样,但它们仍然是分开的。因此,第一个? extends Object(实际上您可以简单地编写它?)与第二个完全不同。

而且,无论何时使用通配符,都不要指望引用类型。但是,您这样做addAll()需要类型检查。

如果您在方法中具有这些逻辑,则可以为您的方法提供适当的类型参数:

public static <T> void addToFirst(Set<T> first, Set<T> second) {
    first.addAll(second);
}

因此可以进行类型检查以确保第一个和第二个是相同的类型。

使用原始类型可能是另一种选择。

问问自己是否真的需要在类型参数中使用通配符。简单的使用Set<Integer>应该是最直接的。

于 2013-07-26T03:21:26.023 回答
1

我相信你可以考虑你的类型擦除源看起来像

Set ss = new HashSet();
set sa = new HashSet();
ss.addAll(sa); // compilation error

如果它被编译

$ cat Erased.java
import java.util.*;

public class Erased {

    public static void main(final String[] args) {

        final Set<Integer> ss = new HashSet<Integer>();
        final Set<Integer> sa = new HashSet<Integer>();

        ss.addAll(sa);
    }
}

$ javap -c Erased
Compiled from "Erased.java"
public class Erased {
  public Erased();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: new           #2                  // class java/util/HashSet
       3: dup
       4: invokespecial #3                  // Method java/util/HashSet."<init>":()V
       7: astore_1
       8: new           #2                  // class java/util/HashSet
      11: dup
      12: invokespecial #3                  // Method java/util/HashSet."<init>":()V
      15: astore_2
      16: aload_1
      17: aload_2
      18: invokeinterface #4,  2            // InterfaceMethod java/util/Set.addAll:(Ljava/util/Collection;)Z
      23: pop
      24: return
}

这里是反编译的源代码

import java.util.HashSet;
import java.util.Set;

public class Erased
{
  public static void main(String[] paramArrayOfString)
  {
    HashSet localHashSet1 = new HashSet();
    HashSet localHashSet2 = new HashSet();

    localHashSet1.addAll(localHashSet2);
  }
}
于 2013-07-26T02:42:20.880 回答