2012-03-01 6 views
8

저는이 흥미로운 메시지를 컴파일러에서 보았습니다. 왜 그런 일이 일어나는지 모르겠습니다. 여기 경우버튼에 전송하는 것이 중복 됨 - 이유가 무엇입니까?

실시 예 제 1 실시 예에서

Button test = (Button) findViewById(R.id.someButtonId); 
test.setOnClickListener(this); 

예 2

findViewById(R.id.someButtonId).setOnClickListener(this); 

이고, I는 ButtonfindViewById에 의해 리턴 된 객체를 전송할 필요가있다. 두 번째 예제에서는 다른 Button 클래스 객체를 사용하지 않았기 때문에 반환 된 객체를 캐스팅 할 필요가 없습니다.

((Button)findViewById(R.id.someButtonId)).setOnClickListener(this); 

나는 Casting findViewById(R.id.someButtonId) to Button is redundant 경고 메시지가 표시됩니다.

왜 이런 일이 발생합니까? 나는 캐스트 경고를 제거하려고하지 않습니다. 이의 논리를 알고 을 알고 싶습니다. findViewById에 의해 반환 된 개체를 사용하여 다른 개체를 초기화하지 않으려면 왜 캐스팅이 필요하지 않은지를 원합니다.

+0

http://stackoverflow.com/questions/3502690/remove-redundant-casts-in-java –

+0

@Samir 나는 그것을 제거하는 방법을 알고 있습니다. :) 나는 그것을 필요로하지 않는다. 나는 ** 캐스팅이 필요없는 이유를 묻습니다. – sandalone

+0

: (경고 메시지가 표시되지 않습니다. – Triode

답변

6

이유를 할 충분하다. 즉, 캐스트를 수행하지 않아도 리스너를 설정할 수 있습니다. 따라서 캐스트가 중복됩니다.

+0

여기에 물어보십시오 : examp2와 같이 사용하는 것이 안전할까요? – sandalone

+1

예 2로 완벽합니다. –

+0

왜 안전하지 않다고 생각하십니까? –

2

같이 findViewById() 항상 같은 이미지 뷰, 버튼 등 모든 뷰의 부모 뷰를 돌려줍니다 ...

setOnClickListener보기 클래스의 방법이다. 따라서 버튼에 전송하지 않고 클릭 이벤트를 잡을 수 있습니다. 나는 그것이 단지 여분이라고 말한다라고 생각한다.

0

나는 setOnClickListener()가 Button이 아닌 View에있는 메소드라고 생각하고 있으므로 깁스가 중복됩니다.

2

이 이유는 예제 1에서 Button 변수에 할당하기 때문에 명시 적으로 버튼을 찾아야하기 때문입니다.

OnClickListener는 모든 유형의 View 용이므로 View의 특정 하위 클래스로 캐스팅하지 않아도 OnClickListener를 설정할 수 있습니다. 당신이 View에 정의되어 setOnClickListener를 호출하기 위해 ButtonView 캐스팅 할 필요가 없기 때문에

+0

예 2와 같이 사용하면 안전할까요 ?? ? – sandalone

+1

물론입니다. 보기 2가 예제 2에서 발견 되더라도 OnClickListener를 설정할 수 있습니다. –

+1

다른 어떤 뷰에도 id someButtonId를 사용하지 않으므로 확실하게 버튼이라는 것을 알 수 있습니다. –

1

이 일어나고. 당신이 findViewById 반환 View는이 클래스가 이미 방법 setOnClickListener를 정의하기 때문입니다받을 이유는 findViewById(R.id.someButtonId).setOnClickListener(this);