거의 모든 메서드 인수와 반환 형식이 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);
}
, 내가 만약 궁금 : 나는 기존 클래스 메서드를 래핑 수있는 두 개의 기능적으로 동일한 방법이 있었다 발견 legacyMethodWrapper1
과 legacyMethodWrapper2
사이의 다른 미묘한 차이가 누락되었습니다. legacyMethodWrapper2
은 추가 Class
개체에 액세스 할 수 있으며 캐스팅 이외의 복잡한 작업을 수행 할 수 있습니까?
편집 : 1) 발신자에 안전한 형태를 제공하는 이들 기존의 방법을 포장의 목표 중 하나, 명확하게 2) 의미 경고를 볼 호출을 방지하기 위해. 컴파일러가 알지 못하는 저조한 레거시 클래스에 대해 더 많이 알고 있기 때문에 100 % 타입의 안전한 인터페이스를 제공하고 무의미한 컴파일러 경고를 숨길 수 있습니다.
-
아래는 필자의 것입니다. 특히 래퍼 1과 래퍼 2는 실제로 원시 형식을 사용하는 것과 크게 다른 작업을 수행하지 않습니다. – scottb
물론 컴파일러는 코드가 * 안전하다는 것을 알 수 없기 때문에 캐스팅 및 컴파일러 경고를 감추고 숨기려고합니다. –