(Integer. 1)
据我所知,它与遵循Java代码相同:
new Integer(1)
所以现在我有了以下建设
(Integer. (Long. 1))
#=> 1
这是如何工作的? Java Integer类已two constructors,但他们不接受Long
。
顺便说一下,以下没有工作:
(Long. (Integer. 1))
答案 0 :(得分:1)
这确实看起来像Clojure中的一个错误。对于Java,它是相反的方式。这似乎与CLJ-445有关,这是一项超过五年的“增强”请求。用这个简单的例子来解决这个问题也许是最好的。
由于unboxing和widening的组合, new Long(new Integer(1))
应该可以接受。
使用拆箱(自动装箱的反转),一些对象被隐式转换为基本类型:
将包装类型(Integer)的对象转换为其对应的primitive(int)值称为取消装箱。当包装类的对象为:
时,Java编译器应用拆箱
- 作为参数传递给期望相应基元类型值的方法。
- 分配给相应基元类型的变量。
在此示例中,Integer
个对象隐式缩减为int
,Long
个对象隐式缩减为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');
}
});
。