2014-09-10 2 views
0

오류 : CAP # 1은 새로운 유형이 아닌캐스트 유형

코드 :

public Boolean isAssigned(HttpServletRequest request, String name, Foo foo) { 
    Boolean isAssigned = false; 

    if ((foo.getClass()) request.getSession().getAttribute(name) != null) { 
     isAssigned = true; 
    } 

    return isAssigned; 
} 

해결책은 무엇인가?

+2

어떤 조건의 일부를 캐스팅 하시겠습니까? 지금은'request.getSession(). getAttribute (name)'의 결과를 캐스팅 한 후 나중에 캐스팅하지 않고 할 수있는'! = null'을 확인하는 것처럼 보입니다. – Smutje

+0

오. 나는 그것이 캐스팅 된 bean에서 메소드를 실행하도록 메소드를 변경하면 유용 할 것이라고 생각한다. – ThreaT

답변

1

이되지 않을 수 있습니다 무엇을 찾고 있지만 제목의 질문에 답합니다.

Class<T> 클래스는 객체를 T 유형으로 캐스팅 할 수있는 cast 메소드를 가지고 있습니다. 오브젝트가 그 타입에 캐스트 할 수없는 경우는 분명히 ClassCastException가됩니다.

public <T> T castTo(Class<T> t, Object o) { 
    return t.cast(o); 
} 

public <T> T castTo(T t, Object o) { 
    return (T) castTo(t.getClass(), o); 
} 

public void test() { 
    String s = "Hello"; 
    Object b = s; 
    String c = castTo(String.class, b); 
    String d = castTo("Some String", b); 
} 
+0

어떻게 이것을 코드에 적용할까요? – ThreaT

+0

@ThreaT - 죄송합니다. 코드가 이해가 안되므로 인스턴스를 사용하여 * Cast 유형에 대한 질문에 답변했습니다. – OldCurmudgeon

-1

당신이

request.getSession().getAttribute(name) 

유형 Foo인지 여부를 테스트하고 그것을하는 방법 method을 실행하려면 나중에 당신은 단순히 instanceofcast를 사용하여 시도 할 수 :

if (request.getSession().getAttribute(name) instanceof Foo) { 
    ((Foo) request.getSession().getAttribute(name)).method(); 
} 
+0

'foo'가'Foo'의 서브 클래스라면'foo.getClass()'대신'Foo'를 사용하면 다른 결과를 줄 것입니다. – Holloway

+0

@ Trengot "다른 결과를 줄 것"이란 정확히 무엇을 의미합니까? – Smutje

+0

동일한 입력을 받았을 때 사용하는 프로그램에 따라 프로그램이 다르게 실행됩니다. 'foo'가'SubFoo' ('SubFoo'가'Foo'를 확장)이고'getAttribute()'가'Foo' (또는 다른 하위 클래스 (SubFoo'의 하위 클래스는 아닙니다))를 반환하면 if 'instanceof foo'를 사용한다면 블록이 입력되고'instanceof foo.getClass()'는 사용되지 않을 것입니다. – Holloway