Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么不是';t toString()始终自动调用_Java_Android_Android Adapterview - Fatal编程技术网

Java 为什么不是';t toString()始终自动调用

Java 为什么不是';t toString()始终自动调用,java,android,android-adapterview,Java,Android,Android Adapterview,那么为什么toString不总是被调用呢?这是一个使用Android API的示例 例如 @覆盖 已选择公共视图(AdapterView AdapterView、View、, 内部位置,长id){ Toast.makeText(this,adapterView,Toast.LENGTH_LONG).show(); } 不会编译。但是如果我把它改成 @Override public void onItemSelected(AdapterView<?> adapterView, Vie

那么为什么toString不总是被调用呢?这是一个使用Android API的示例

例如

@覆盖
已选择公共视图(AdapterView AdapterView、View、,
内部位置,长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();
}
@覆盖
已选择公共视图(AdapterView AdapterView、View、,
内部位置,长id){
Toast.makeText(this,adapterView.toString(),Toast.LENGTH_LONG).show();
}

会的。实际的区别是什么?

你说的“总是”是什么意思
toString()
只是一个返回对象的
String
表示的方法。
Toast.makeText
需要一个
String
参数,但在第一种情况下,您提供了一个
AdapterView
类的对象。因此它不会编译:)

编译器插入toString()的唯一情况是字符串串联。

adapterView
不是
字符串


编译器不会自动调用
toString()
来执行强制转换,这会稍微破坏类型安全性。例如,只有当有一个
+”
时,编译器才会自动调用toString()。

我不知道Android API,但AdapterView实际上不是CharSequence的子类,所以必须应用toString()。

我想Toast.makeTest的第二个参数是String类型。然后尝试传递AdapterView类型的参数将不起作用。toString()永远不会自动调用,除非在连接字符串时(“+adapterView”也可以,但更难看)。

编译器根据方法的名称以及提供的每个参数的数量和类型来决定需要哪个方法。在第一个示例中,它查找名为makeText的方法,该方法的第二个参数是AdapterView,但没有找到(编译错误会告诉您这一点)。在第二个示例中,第二个参数是字符串,编译器会找到匹配的方法。 请注意,编译器无法先找到方法,然后再调整参数,否则我们无法重载方法。

同样,这

@Override
public void onItemSelected(AdapterView<?> adapterView, View view,
            int position, long id) {
    Toast.makeText(this, "" + adapterView, Toast.LENGTH_LONG).show();
}
@覆盖
已选择公共视图(AdapterView AdapterView、View、,
内部位置,长id){
Toast.makeText(这个““+adapterView,Toast.LENGTH_LONG.show();
}

将编译;)

谢谢。我通常使用System.err调试代码,但忘记了它能够处理的不仅仅是字符串。:)
@Override
public void onItemSelected(AdapterView<?> adapterView, View view,
            int position, long id) {
    Toast.makeText(this, "" + adapterView, Toast.LENGTH_LONG).show();
}