2

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

例如

@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();
}

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

4

7 回答 7

8

adapterView不是一个String

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

于 2011-01-16T13:40:21.060 回答
6

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

于 2011-01-16T13:39:25.777 回答
5

永远是什么意思?toString()只是一个返回String对象表示的方法。Toast.makeText需要一个参数,但在第String一种情况下,您给出了一个AdapterView类的对象。所以它不会编译:)

于 2011-01-16T13:38:28.993 回答
1

还有,这

@Override
public void onItemSelected(AdapterView<?> adapterView, View view,
            int position, long id) {
    Toast.makeText(this, "" + adapterView, Toast.LENGTH_LONG).show();
}

将编译;)

于 2011-01-16T13:43:22.883 回答
0

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

于 2011-01-16T13:40:30.023 回答
0

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

于 2011-01-16T13:41:04.833 回答
0

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

于 2011-01-16T13:42:28.260 回答