2014-09-24 2 views
2

나는 Generics에 익숙하지 않으며 문제가 있습니다.체크 된 캐스트를 수행하는 방법은 무엇입니까?

public class A {} 
public class B extends A {} 

public <T extends A> T getB() 
{ 
    A test = new B(); 
    Class<B> clazz = B.class; 
    if (clazz.isInstance(test)) 
    { 
     return (T)test; 
    } 
    return null; 
} 

이 검사되지 않은 캐스트 경고를 생성

는 다음과 같은 코드를 생각해 보자. return (T)test; 행에 있습니다. 하지만 분명히 if (clazz.isInstance(test)) 행으로 유형을 확인하고 있습니다.

"체크 된 캐스트"할 수있는 방법이 있습니까?

경고를 표시하지 않고 실제로 체크 된 캐스트를 구현하려고하지 않습니다. 불행히도 체크 캐스트를 수행하는 방법에 대한 정보를 찾을 수 없습니다.

답변

7

"체크 된 캐스트"할 수있는 방법이 있습니까? 물론

, 그것은 당신의 방법이 있기 때문에, 여기에 있지 정말 도움을 않는다는 점에 유의하는 것이 중요하지만 몇 군데에서 B를 사용하는 하드는 코딩. 당신과 함께 캐스트를 수행 할 수 있습니다

clazz.cast(test) 

...하지만 B하지 T으로 캐스팅됩니다. 특히, 내가 달렸다고 가정 해보자.

public class C extends A {} 

... 

C c = foo.<C>getB(); 

어떻게하면 되겠습니까? 당신이 좋아하는 뭔가 코드를 변경할 수 있습니다

: clazz.cast 당신이 돌아 괜찮아요 유형 T의 값을 반환하기 때문에

public <T extends A> T getB(Class<T> clazz) 
{ 
    A test = // get A from somewhere 
    return clazz.isInstance(test) ? clazz.cast(test) : null; 
} 

그런 다음 즉, 괜찮습니다.

+0

완벽! 내 실제 코드는 Class 매개 변수에서 이미 전달되었습니다. 이상한 나는 "던지다"기능을 놓쳤다. 감사! – AllenKll

관련 문제