我有一个基本的疑问,我们可以增加Integer类对象的引用,而不是任何其他类的引用(D类有1个Integer数据成员和一个参数化构造函数)。
let saveAction = UIAlertAction(title: "Search",
style: UIAlertActionStyle.Default,
handler: {(action) in
let query =
(alertController.textFields?[0] as UITextField).text ### errors here
let tag = query
if !query.isEmpty {
if self.model.queryForTag(tag) != nil {
}
else if isNew {
self.model.saveQuery(
query, forTag: tag, syncToCloud: true)
let indexPath =
NSIndexPath(forRow: 0, inSection: 0)
self.tableView.insertRowsAtIndexPaths([indexPath],
withRowAnimation: .Automatic)
self.forceSearch(indexPath)
self.tableView.reloadData()
}
}
})
这里x和d都是引用仍然我们能够增加整数引用而不是任何其他引用。我遗漏了一些非常基本的东西,请帮帮我。
答案 0 :(得分:2)
Integer x=new Integer(10); x++;
这里java编译器将执行对象的un-boxing
,它将Integer
对象转换为原始int
。然后执行增量操作。这仅适用于java原语,auto-boxing
是将原语转换为包装器对象,反之则是调用un-boxing
。这就是这里发生的事情。
auto-boxing
或un-boxing
是自动转换,仅为java基元定义。所以它不能在其他对象上执行。请记住,对象不仅仅是C or C++
等内存引用,我们可以递增它们。
答案 1 :(得分:1)
这是因为从jdk 1.5引入的包装类的Autoboxing。内部java会将整数引用转换为int并递增它。你不能增加对象。
答案 2 :(得分:1)
Java无法为任意类重载运算符。因此,public class D {
private int value;
public D( int v ){
value = v;
}
public void increment(){
value++;
}
}
无法使用。你可以这样做:
D d = new D(10);
d.increment();
现在你可以做到
RestAdapter retrofit= new RestAdapter.Builder().setEndpoint("end_point_url")
.build();
AbebeerApi service = retrofit.create(AbebeerApi.class);
service.getBeer(new Callback<BeerResponse>() {
@Override
public void success(BeerResponse beerResponse, Response res) {
// Use beerResponse for response
}
@Override
public void failure(RetrofitError error) {
}
});
和d's的值将是11。
答案 3 :(得分:1)
根据Oracle Java Documentation,原始数据类型自动转换为等效的包装类型称为autoboxing
,相反的操作称为unboxing
。每当我们在表达式中使用包装类的对象时,JVM就会自动进行拆箱和自动装箱。
Integer object;
object = 100; //Autoboxing of int
++object;
当我们对Integer对象执行增量操作时,首先将其取消装箱,然后递增,然后再次重新装箱为Integer类型对象。您还可以查看How java auto boxing/unboxing works?