我正在通过Android示例的第二次练习记事本app,我有一个关于用于定义mRowId的Long和long之间差异的问题。
练习在这里:http://developer.android.com/resources/tutorials/notepad/notepad-ex2.html
以下是我遇到问题的代码:
public class NoteEdit extends Activity {
private Long mRowId;
private EditText mTitleText;
private EditText mBodyText;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.note_edit);
setTitle(R.string.edit_note);
mTitleText = (EditText) findViewById(R.id.title);
mBodyText = (EditText) findViewById(R.id.body);
Button confirmButton = (Button) findViewById(R.id.confirm);
mRowId = null;
当我用long
声明mRowId时,当我尝试将mRowId设置为null时出错,错误是“类型不匹配”。但如果我使用Long
,错误就会消失。为什么long
无效?
答案 0 :(得分:3)
Long
是围绕primitive long
的包装类。因此Long
是一个对象;对象可以是null
,原语不能。
答案 1 :(得分:0)
long
是原始类型,Long
是long
的盒装类型。在java中发布自动装箱功能后,原始long
可以自动转换为Long
,这是一个对象。
但有些时候这也会产生问题。例如,下面的代码非常慢:
public static void main(String[] args)
{
Long sum = 0L;
for(long i=0; i < Integer.MAX_VAL; i++){
sum+=i;
}
}
这是因为程序由于sum
声明中的大写字母L而无意中不必要地创建了2 ^ 31个对象。