2011-01-16 3 views
2

그래서 toString이 항상 호출되지 않는 이유는 무엇입니까? 이것은 Android API를 사용하는 예입니다.toString()이 항상 자동으로 호출되지 않습니다.

예컨대

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

이됩니다. 실제 차이점은 무엇입니까?

답변

5

항상 당신은 무엇을 의미합니까? toString()은 객체의 표현을 String으로 반환하는 방법 일뿐입니다. Toast.makeTextString 매개 변수를 필요로하지만, 첫 번째 경우에는 AdapterView 클래스의 개체를 제공합니다. 따라서 컴파일되지 않습니다.

+0

감사합니다. 일반적으로 System.err을 사용하여 코드를 디버깅하고 단순히 문자열 이상을 처리 할 수 ​​있는지 잊어 버렸습니다. :) – whirlwin

6

toString()이 컴파일러에 의해 삽입되는 유일한 상황은 문자열 연결입니다.

8

adapterViewString이 아닙니다.

toString()은 캐스트를 수행하기 위해 컴파일러에서 자동으로 호출되지 않으므로 형식 안정성이 다소 저하 될 수 있습니다. 예를 들어 +""이있을 때만 컴파일러에서 자동으로 toString()을 호출합니다.

0

Android API를 모르지만 AdapterView는 실제로 CharSequence의 하위 클래스가 아니므로 toString()을 적용해야합니다.

0

Toast.makeTest의 두 번째 매개 변수는 String 유형으로 가정합니다. 그런 다음 AdapterView 유형의 매개 변수를 전달하려고하면 작동하지 않습니다. toString()은 Strings를 연결하는 경우를 제외하고는 자동으로 호출되지 않습니다 ("+ adapterView는 잘 동작하지만 더 못생긴 것입니다).

0

컴파일러는 메소드 이름과 제공된 각 인수의 수 및 유형에서 필요한 메소드를 결정합니다. 첫 번째 예제에서는 AdapterView를 두 번째 매개 변수로 사용하는 makeText라는 메서드를 찾고 아무 것도 찾지 않습니다 (두 번째 예제에서는 String이고 컴파일러는 일치하는 항목을 찾습니다). . 컴파일러는 매개 변수, 다른 우리가 과부하 수 없었다 방법에 적합하게 한 후, 첫번째 방법을 찾을 수있는 방법 주

1
또한

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

컴파일 것이다.)