Java错误:CAP#1,int,其中CAP#1是新的类型变量:CAP#1扩展了对象的捕获范围?

问题描述 投票:0回答:3

使用此通用元组类

public class Pair< T1, T2 > {

  private final T1 first;
  private final T2 second;

  public Pair(T1 first, T2 second) {
    this.first = first;
    this.second = second;
  }

  public T1 getFirst() {
    return first;
  }

  public T2 getSecond() {
    return second;
  }

}

和此驱动程序

public class PairDriver {

  public static void main(String[] args) {

    Pair<?, ?>[] s = new Pair<?, ?>[3];
    s[0] = new Pair<String, Integer>("a", 1);
    s[1] = new Pair<String, Integer>("b", 2);
    s[2] = new Pair<String, Integer>("c", 3);

    System.out.println( s[0].getFirst().getClass().getName() ); // Should be String
    System.out.println( s[0].getSecond().getClass().getName() ); // Should be Integer

    System.out.println( s[0].getFirst() );
    System.out.println( s[0].getFirst() + "!!!" ); // Operation works

    System.out.println( s[0].getSecond() );
    System.out.println( s[0].getSecond() + 2 ); // Operation FAILS...
  }

}

我收到以下错误:

pairDriver.java:17: error: bad operand types for binary operator '+'
    System.out.println( s[0].getSecond() + 2 ); // Operation FAILS...
                                         ^
  first type:  CAP#1
  second type: int
  where CAP#1 is a fresh type-variable:
    CAP#1 extends Object from capture of ?
1 error
error: compilation failed

我对为什么会这样感到困惑。所有行直到标记为// Operation FAILS...的行都运行-类型似乎正确,并且操作甚至可以使用String,但不能使用Integer。

作为后续:我看到有人通过用类型替换通配符?来解决类似的错误。我不明白为什么这在他们的情况下有效,但是在这里不适用,因为用Pair<String, Integer>[] s = new Pair<String, Integer>[3];这样的类型声明数组会导致不同的错误:

pairDriver.java:5: error: generic array creation
    Pair<String, Integer>[] s = new Pair<String, Integer>[3];
                                ^
1 error
error: compilation failed

我也很奇怪为什么会发生这种情况。

使用此通用元组类公共类Pair {私有最终T1首先;私人决赛T2秒; public Pair(T1 first,T2 second){this.first = first; this.second = ...

java generics wildcard
3个回答
0
投票

在运行时将删除添加到Pair类的数据类型。编译器只知道从getFirst()getSecond()出来的数据是扩展Object,但是它不知道具体是什么。


0
投票
很简单,它与String一起使用,因为您可以将String与任何其他Object或基本类型连接在一起。

0
投票
我对为什么会这样感到困惑
© www.soinside.com 2019 - 2024. All rights reserved.