Java 类型擦除在这里是如何工作的?

Java 类型擦除在这里是如何工作的?,java,generics,Java,Generics,有人能帮我找出如何应用类型擦除/泛型使其工作吗 Set<? extends Object> ss = new HashSet<Integer>(); Set<? extends Object> sa = new HashSet<Integer>(); ss.addAll(sa); SET我相信你可以考虑你的类型擦除源看起来像 Set ss=new HashSet(); set sa=新的HashSet(); ss.addAll(sa);//编译

有人能帮我找出如何应用类型擦除/泛型使其工作吗

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

<代码> SET

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

Set ss=new HashSet();
set sa=新的HashSet();
ss.addAll(sa);//编译错误
如果已编译

$ 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
}

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

它们是两个独立的通配符。虽然它们看起来一样,但仍然是分开的。因此,首先是
?扩展对象
(实际上您可以简单地编写它?)与第二个对象完全不同

而且,无论何时使用通配符,都不要期望引用该类型。但是,您在需要进行类型检查的
addAll()
中执行此操作

如果方法中包含这些逻辑,则可以为方法指定适当的类型参数:

public static <T> void addToFirst(Set<T> first, Set<T> second) {
    first.addAll(second);
}
publicstaticvoidaddtofirst(先设置,后设置){
第一,addAll(第二);
}
这样就可以进行类型检查,以确保第一个和第二个是同一类型的

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


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

你想实现什么?仅存储整数或任何旧对象?如果我的问题不清楚,尝试将HashSet添加到另一个HashSetOrry。我的问题是如何应用类型擦除,以便addAll方法接受localHashSet2。类型擦除是由编译器而不是您应用的。