那么为什么不总是调用toString?这是使用Android API的示例。
E.g
@Override
public void onItemSelected(AdapterView<?> adapterView, View view,
int position, long id) {
Toast.makeText(this, adapterView, Toast.LENGTH_LONG).show();
}
不会编译。但是,如果我将其更改为
@Override
public void onItemSelected(AdapterView<?> adapterView, View view,
int position, long id) {
Toast.makeText(this, adapterView.toString(), Toast.LENGTH_LONG).show();
}
会的。实际差异是什么?
答案 0 :(得分:8)
adapterView
不是String
。
toString()
来执行强制转换 - 这会破坏类型安全性。只有当有+""
时,编译器才会自动调用toString()。
答案 1 :(得分:6)
编译器插入toString()的唯一情况是字符串连接。
答案 2 :(得分:5)
你总是这么说什么? toString()
只是一个返回对象String
表示的方法。 Toast.makeText
需要String
参数,但在第一种情况下,您会给出AdapterView
类的对象。所以它不会编译:)
答案 3 :(得分:1)
另外,这个
@Override
public void onItemSelected(AdapterView<?> adapterView, View view,
int position, long id) {
Toast.makeText(this, "" + adapterView, Toast.LENGTH_LONG).show();
}
将编译;)
答案 4 :(得分:0)
我不知道Android API,但是AdapterView实际上并不是CharSequence的子类,所以你必须应用toString()。
答案 5 :(得分:0)
我认为Toast.makeTest的第二个参数是String类型。然后尝试传递AdapterView类型的参数将无法正常工作。永远不会自动调用toString(),除非连接字符串(“”+ adapterView也能工作,但更难看)。
答案 6 :(得分:0)
编译器根据方法名称以及提供的每个参数的数量和类型决定需要哪种方法。在你的第一个例子中,它查找一个名为makeText的方法,它有一个AdapterView作为它的第二个参数,并且找不到(你的编译错误会告诉你。在你的第二个例子中,第二个参数是一个字符串,编译器找到匹配方法。 请注意,编译器首先找不到方法,然后使参数适合,否则我们不能重载方法。