将java.lang.Long传递给Integer构造函数

时间:2015-10-27 08:25:08

标签: clojure

(Integer. 1)

据我所知,它与遵循Java代码相同:

new Integer(1)

所以现在我有了以下建设

(Integer. (Long. 1))
#=> 1

这是如何工作的? Java Integer类已two constructors,但他们不接受Long

顺便说一下,以下没有工作:

(Long. (Integer. 1))

1 个答案:

答案 0 :(得分:1)

这确实看起来像Clojure中的一个错误。对于Java,它是相反的方式。这似乎与CLJ-445有关,这是一项超过五年的“增强”请求。用这个简单的例子来解决这个问题也许是最好的。

由于unboxingwidening的组合,

new Long(new Integer(1))应该可以接受。

使用拆箱(自动装箱的反转),一些对象被隐式转换为基本类型:

  

将包装类型(Integer)的对象转换为其对应的primitive(int)值称为取消装箱。当包装类的对象为:

时,Java编译器应用拆箱      
      
  • 作为参数传递给期望相应基元类型值的方法。
  •   
  • 分配给相应基元类型的变量。
  •   

在此示例中,Integer个对象隐式缩减为intLong个对象隐式缩减为long

通过扩展,可以在没有信息丢失的情况下将原始类型隐式转换为“更宽”的基元类型。这意味着int可以转换为long,但不能转换为new Integer(new Long(1)),因此应拒绝$urlRouterProvider.rule(function ($injector, $location) { var UserService = $injector.get('UserService'); var path = $location.path(), normalized = path.toLowerCase(); if (!UserService.isLoggedIn() && path.indexOf('login') === -1) { $location.path('/login/signin'); } });