拆箱无法理解

时间:2016-05-19 21:16:45

标签: java unboxing

public class AccountManager {

    priavte Map accountTotals = new HashMap();
    private int retirementFund;

    public int getbalance(String accountName) {
        **Integer Total = (Integer) accountTotals.get(accountName);
        if(total == Null)
            total = Integer.valueof(0);
        return total.intValue;**
    }

    public void setBalance (string accountName, int amount) {
        accountTotals.put(accountname, Integer.valueof(amount));
    }
}

我可以用其中两个替换突出显示的代码来执行它:

1:

int Total = accountTotals.get(accountName);
if(total == null)
    total = 0;
return total;

2:

Integer total = accountTotals.get(accountName);
if(total == null)
    total = 0;
return total;

3:

return accountTotals.get(accountName);

有人能告诉我上面哪3个我应该用突出显示的代码替换?为什么?

谢谢!

2 个答案:

答案 0 :(得分:1)

您的代码应如下所示:

public class AccountManager {
    private Map<String, Integer> accountTotals = new HashMap<>();
    private int retirementFund;

    public int getbalance(String accountName) {
        Integer total = accountTotals.get(accountName);
        if(total == null) {
            return 0;
        }
        return total;
    }

    public void setBalance (String accountName, int amount) {
        accountTotals.put(accountName, amount);
    }
}

除了源代码中的许多拼写错误之外,还有一些解释:

  • 使用地图的通用版本:Map<String, Integer>。当您从地图上放置或获取数据时,这将为您提供类型安全。
  • 不幸的是,Java泛型不适用于原始类型。因此,地图必须包含装箱的Integer实例。
  • 另一方面,这允许您使用total == null条件来检查值是否在地图中。这就是您需要使用Integer total = accountTotals.get(accountName)代替int total = accountTotals.get(accountName);的原因。如果该值不存在,后者将尝试取消get()的结果以将其存储在int变量中。但由于null无法取消装箱,因此您将获得NullPointerException
  • 返回时,您只需编写return total;即可。即使total的类型为Integer且结果类型为int,Java也会自动取消装箱值。当然,如果total不是null
  • ,则只能执行此操作

由于您的问题可能是针对Integerint之间的转换,因此您可以看到Java正在自动执行双向转换(装箱:accountTotals.put(accountName, amount),取消装箱:{{1 }})。您只需要记住,只有return total可以包含Integer,如果您尝试取消null值,则会获得null

答案 1 :(得分:0)

int不允许为null。允许整数为空。来自hashmap的访问可以返回null,因此该值不能是int ...