通配符类型不匹配(int)编译错误,但不是(字符串)

时间:2016-10-13 17:54:15

标签: java wildcard

我已经阅读了几个与我类似的问题,但我仍然没有看到发生了什么,或者为什么它只发生在(int)而不是其他更复杂的类型:

    HashMap<?, ?> returncp = startAndWaitForJob("DSP_WF_" + operation, cp);

    DSPResponseDTO dto = (DSPResponseDTO) returncp.get("RESPONSE_OBJECT");
    String respDesc = (String) returncp.get("statusInfoResponseDescription");
    int respCode = (int) returncp.get("statusInfoResponseCode");

编译错误:

[javac]         int respCode = (int) returncp.get("statusInfoResponseCode");
[javac]                                             ^
[javac]   required: int
[javac]   found:    CAP#1
[javac]   where CAP#1 is a fresh type-variable:
[javac]     CAP#1 extends Object from capture of ?

已经考虑过的问题:

incompatible types and fresh type-variable

Bounded-wildcard related compiler error

Java: Wildcard Types Mismatch Results in Compilation Error

2 个答案:

答案 0 :(得分:0)

我不知道地图中有哪些类型,但这里

$(document).ready(function() {

  function sumRows() {
    var sum = 0,
      total = $('#total');
    $('#myteam tr').each(function() {
      var amount = $(this).find('input[name="amount"]'),
        checkbox = $(this).find('input[name="include"]');
      if (checkbox.is(':checked') && amount.val().length > 0) {
        sum += parseInt(amount.val(), 10);
      }
    });
    total.text(sum);    
    $("#diff").text(Math.abs(sum - parseInt(total2.innerText)));
  }

  function sumRows2() {
    var sum2 = 0,
      total2 = $('#total2');
    $('#otherteam tr').each(function() {
      var amount2 = $(this).find('input[name="amount2"]'),
        checkbox2 = $(this).find('input[name="include2"]');
      if (checkbox2.is(':checked') && amount2.val().length > 0) {
        sum2 += parseInt(amount2.val(), 10);
      }
    });
    total2.text(sum2);
    $("#diff").text(Math.abs(parseInt(total.innerText)- sum2));
  }

  // calculate sum anytime checkbox is checked or amount is changed
  $('input[name="amount"], input[name="include"]').on('change keyup blur', sumRows);
  $('input[name="amount2"], input[name="include2"]').on('change keyup blur', sumRows2);

});

您将String respCode = (int) returncp.get("statusInfoResponseCode"); 来电的结果投放到get并将其分配给int

如果是String,请使用

Integer

答案 1 :(得分:0)

首先是CAP#1

我发现了quote

  

究竟是什么“捕捉#337?”意思?当编译器在其类型中遇到带有通配符的变量时,例如rebox()的box参数,它知道必须有一些T,其中box是Box。它不知道T代表什么类型,但它可以为该类型创建一个占位符来引用T必须的类型。该占位符称为捕获该特定通配符。在这种情况下,编译器已经指定了名称“capture#337 of?”到盒子类型的通配符。每个变量声明中每次出现一个通配符都会获得不同的捕获,因此在泛型声明foo(Pair x,Pair y)中,编译器会为四个通配符中的每一个的捕获分配不同的名称,因为它们之间没有任何关系。任何未知类型参数。

现在让我们回到消息CAP#1 extends Object from capture of ?

它将CAP#1视为Object的实例,更像是扩展类Object的类的实例。

现在需要想象通用在编译时转换为强制转换。这意味着:

HashMap<?, ?> map = new HashMap();
int test = (int) map.get("");

或多或少相当于:

HashMap<?, ?> map = new HashMap();
int test = (int) (Object) map.get("");

Object强制转换为'int'是不可能的(或编译器允许的)。 当然,这个Object用于简化表示。

但完全可以将Object转换为'String'或'Integer'。

所以你能做的是:

HashMap<?, Integer> returncp = startAndWaitForJob("DSP_WF_" + operation, cp);

在这种情况下,你甚至不需要施放任何东西(see)。

但如果出于任何原因无法做到这一点:

int respCode = ((Integer) returncp.get("statusInfoResponseCode")).intValue();