2016-11-14 1 views
2

거의 모든 메서드 인수와 반환 형식이 Object 인 복잡한 레거시 클래스와 상호 작용해야합니다.자바 : 일반 반환 형식, 클래스 매개 변수 대 브라켓 통화의 차이점은 무엇입니까?

필자가 알기로 나는 작은 기능만을 다룰 것이며 모든 인수와 리턴 타입의 정확한 유형을 알고있다. 내 코드를 좀 더 친숙하게 만들기 위해 구체적인 유형으로 만 작업하고 수행해야하는 모든 캐스팅을 묻고 싶습니다. 여기에 나와있는 간단한 코드의 모든 기능 차이가있을 것 같지 않지만

public class LegacyClass { 
    public Object legacyMethod(Object o) { 
     ... 
    } 
} 
LegacyClass foo = new LegacyClass(); 

private <T> T legacyMethodWrapper1(String s) { 
    return (T) foo.legacyMethod(s); //Warning: unchecked cast 
} 

private <T> T legacyMethodWrapper2(String s, Class<T> c) { 
    return (T) foo.legacyMethod(s); //Warning: unchecked cast 
} 

public String getLegacyDataString1(String s) { 
    return this.<String>legacyMethodWrapper1(s); 
} 

public String getLegacyDataString2(String s) { 
    return this.legacyMethodWrapper2(s, String.class); 
} 

, 내가 만약 궁금 : 나는 기존 클래스 메서드를 래핑 수있는 두 개의 기능적으로 동일한 방법이 있었다 발견 legacyMethodWrapper1legacyMethodWrapper2 사이의 다른 미묘한 차이가 누락되었습니다. legacyMethodWrapper2은 추가 Class 개체에 액세스 할 수 있으며 캐스팅 이외의 복잡한 작업을 수행 할 수 있습니까?

편집 : 1) 발신자에 안전한 형태를 제공하는 이들 기존의 방법을 포장의 목표 중 하나, 명확하게 2) 의미 경고를 볼 호출을 방지하기 위해. 컴파일러가 알지 못하는 저조한 레거시 클래스에 대해 더 많이 알고 있기 때문에 100 % 타입의 안전한 인터페이스를 제공하고 무의미한 컴파일러 경고를 숨길 수 있습니다.

+0

-

아래는 필자의 것입니다. 특히 래퍼 1과 래퍼 2는 실제로 원시 형식을 사용하는 것과 크게 다른 작업을 수행하지 않습니다. – scottb

+0

물론 컴파일러는 코드가 * 안전하다는 것을 알 수 없기 때문에 캐스팅 및 컴파일러 경고를 감추고 숨기려고합니다. –

답변

1

필연적으로 원하지 않는 한 각 유형에 대해 별도의 메소드를 작성할 필요가 없습니다. 자바 컴파일러는 다음 코드를 안전하게 입력 할 수 있으며, 검사되지 않은 캐스트 경고가 발생하는 경우

class LegacyWrapper{ 
private Legacy legacy = new Legacy(); 
    public <T> T legacyMethodWrapper(Object obj ,Class<T> clazz) throws ClassCastException{ 
    return clazz.cast(legacy.legacyMethod(obj)); 
    } 
} 
+1

이것은 어떻게 처리 할 것인가입니다 만,'public String getString (Object obj) {return legacyMethodWrapper (obj, String.class)}와 같이,이 메소드를 랩 한 주요한 형태 (String, Integer 등)의 편리한 메소드를 작성합니다.);}' – Bohemian

+0

내 목표는 캐스팅을 숨길 수있는 구체적인 유형의 메소드를 제공하여 호출자에 대한 컴파일러 경고를 방지하여 일반 버전을 공용으로 표시하거나 예외를 던지려는 것이 아니라 ... –

+0

컴파일러 경고는 자신의 업무를 수행하고 있습니다. 코드가 유형 안전하지 않을 수 있음을 알려줍니다. 위험에 처하지 않도록하십시오. 가장 좋은 해결책은 원시 형식을 일반 형식으로 변환하는 것입니다. 그게 없으면, 원시 타입을 감싸는 것만으로는 어쨌든 당신이 억압해서는 안되는 컴파일러 경고를 억제하는 것은 아무런 이점이 없습니다. 코드가 실제로 안전하다는 것을 증명할 수 있다면'@ SuppressWarnings'을 사용합니다. – scottb

관련 문제