Java泛型通配符混淆

标签 java generics

<分区>

我最近在学习 Java 泛型,并且只是想通过“Java 泛型常见问题解答”。

下面关于通配符参数化类型的问题 (#304) 让我有点困惑,希望得到你的帮助。

代码示例:

class Box<T> { 
  private T t; 
  public Box(T t) { this.t = t; } 
  public void put(T t) { this.t = t;} 
  public T take() { return t; } 
  public boolean equalTo(Box<T> other) { return this.t.equals(other.t); } 
  public Box<T> copy() { return new Box<T>(t); } 
}

class Test { 
  public static void main(String[] args) { 
    Box<?> box = new Box<String>("abc");
    box.put("xyz");     // error 
    box.put(null);     // ok

    String s = box.take();  // error 
    Object o = box.take();  // ok

    boolean equal = box.equalTo(box);  // error {confused}
    equal = box.equalTo(new Box<String>("abc")); // error {confused}

    Box<?> box1 = box.copy();   // ok 
    Box<String> box2 = box.copy();  // error 
  } 
}

无法弄清楚为什么调用下面两个方法会失败:

boolean equal = box.equalTo(box);
equal = box.equalTo(new Box<String>("abc"));

谢谢

最佳答案

Box<?> box = new Box<String>("abc");
box.put("xyz");     // error 
String s = box.take();  // error 
  1. 在 OOP 中,您使用的是多态性。所以在编译时,盒子对象的类型是 Box<?>

  2. Type<?>这称为未知通配符。因为您不知道键入的 Box 是什么类型,所以您只能从该对象读取,并且只能将读取的对象用作 Object 实例。这就是为什么 box.put("xyz")收到错误和String s = box.take()收到错误。

其次:

boolean equal = box.equalTo(box);

equalTo收到Box<T>不是 Box<?> .正如我上面解释的,T 代表任何类,但是 ?仅表示未知通配符,这两个术语并不相同。

还有一点你应该知道。在 Java 中,泛型是在编译时。与 C# 等其他语言相比,泛型是在运行时。

这是一个关于通配符的引用链接:Java wildcard

希望这有帮助:)

关于Java泛型通配符混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27736943/

相关文章:

java - 返回一个稍后创建的类

C#4.0 : How to find out if types are co-variantly equal

Swift 泛型延期问题

java - Java中的JTable TableModel问题

java - Solr-solrj 4.9.0 在 jdk 1.6 上运行?

javax.ejb.EJBException : java. rmi.MarshalException

java - 文件在 Java 中无法正常工作

Java 泛型 : wildcard and type parameter syntax when defining generic class

java - 尽管在 Java 中被声明为基类型,如何限制同一对象之间的操作

C# 使用通过反射找到的类型作为泛型