2010-01-16 3 views
3

나는이 코드 조각이 :Java에서 주먹없는 캐스트 경고를 제거하려면 어떻게해야합니까?

import java.net.MalformedURLException; 
import java.rmi.Naming; 
import java.rmi.NotBoundException; 
import java.rmi.Remote; 
import java.rmi.RemoteException; 

public class ClientLookup<T extends Remote> { 
private T sharedObject; 

public void lookup(String adress) throws MalformedURLException, RemoteException, NotBoundException { 
    sharedObject = (T) Naming.lookup(adress); 
} 

public T getSharedObject() { 
    return sharedObject; 
} 
} 

"가 (T)을 Naming.lookup (ADRESS)는"나에게 경고를주고있다와 부분 : 유형 안전 "체크되지는를 T로 원격에서 캐스팅 T는 "원격 확장하고 깨끗한 위해 (그것을 해결"난 그냥 때 왜 경고를 보여주는 알고 싶어 "("선택 해제 ") @SuppressWarnings을"

내가 사용하는 wanto하지 않는다 " 코드)

Thnaks.

답변

1

내가 제거 할 수 없었던 유형 캐스팅 제네릭과 관련된 몇 가지 경고가 있습니다. 방금 포기하고 @SuppressWarnings을 사용했습니다.

IDE에 따라 다른 방법은 컴파일러의 문제점을 덜 민감하게 만드는 것입니다. Eclipse에서는 특정 경고를 선택적으로 끌 수 있습니다. Swing GUI 클래스 (다른 것들 중에서)에서 "누락 된 직렬 UID"경고가 상당히 짜증나게 불필요하며이를 비활성화했습니다. 이런 타입 캐스트 경고에 너무 화가 나면 같은 운명을 겪을 것입니다.

7

여기서 "확인되지 않은 캐스트"는 런타임시 T 유형을 알 수 없으므로 런타임에 유형이 T 인 Java가 확인할 수 없음을 의미합니다. 많아야 실제로 유형이 Remote인지 확인할 수 있습니다.

이 문제에 대한 일반적인 해결 방법은 유형을 정의하는 Class<T> 객체를 제공하는 것입니다 :

public class ClientLookup<T extends Remote> { 
    private T sharedObject; 
    private Class<T> clazz; 

    public ClientLookup(Class<T> clazz) { 
    this.clazz = clazz; 
    } 

    public void lookup(String adress) throws MalformedURLException, RemoteException, NotBoundException { 
    sharedObject = clazz.cast(Naming.lookup(adress)); 
    } 

    public T getSharedObject() { 
    return sharedObject; 
    } 
} 

당신이 유형 T 명시 적 및 런타임에 알려져을 만드는이 방법.

+0

+1 잘 작동하는 솔루션을 제공 할 때 수행됩니다. 그러나 나는 진부한 Java에서 당신이 이것을하기 위해지나 가게한다는 것을 두려워합니다! 어쩌면 스칼라 시대가왔다. –

+0

@Carl - 그때 가면 ... 그리고 나가는 길에 문을 쾅 닫지 마라 .-) –

2

Naming.lookup()은 Remote를 반환하므로 캐스트가 실제로 선택 취소되었습니다. 당신은 T의 클래스에 대한 핸들을 가지고 있다면

다음과 같이 사용할 수 있기 때문에 삭제의 T.을 반환

private Class<T> clazz; 
clazz.cast(Naming.lookup(address)); 

당신이 생성자에서 클래스를 줄 필요가, 또는 다른 해커를 사용합니다 예 : MoreTypes.java.