2013-05-20 2 views
2

currenty Java의 제네릭 클래스에 문제가 있습니다. 나는이 점에서 intereseted 않을거야 아니면 내가 그것을 알고하지 않기 때문에, 다른 클래스의 Collection getter를 사용하는 일반 클래스

public class GenericClass<T> { 
    T doSomething() {...} 

    Collection<String> getCollection() {...} 
} 

가 지금은 유형 매개 변수없이 해당 클래스의 객체를 생성 :

나는 이런 식으로 뭔가가있다.

GenericClass obj = new GenericClass(); 
for (String str : obj.getCollection() { // won't work 
    ... 
} 

문제는이 매개 변수의 독립적 비록 컴파일러는 단순히뿐만 아니라 컬렉션 (문자열)의 유형에 대한, 유형 파라미터에 대한 정보를 버리지 않는 것이다.

내가 잘못했거나 Java의 제한 사항입니까? 그렇다면 제한이있는 이유는 무엇입니까?

+0

닫기 둥근 브래킷이 누락되었습니다. – jlordo

+0

[이 일반 자바 코드가 컴파일되지 않는 이유는 무엇입니까?] (http://stackoverflow.com/questions/662191/why-wont-this-generic- java-code-compile) –

+0

어떤 오류 메시지가 나타 납니까? – Raedwald

답변

4

잘못된 것을하고 있습니다.

T 유형을 모르면 와일드 카드 (GenericClass<?>) 만 사용해야합니다. 새 GenericClass를 인스턴스화 할 때 당신은이 작업을 수행 할 수 있습니다,하지만, 그래서 그냥 Object 사용

이전 버전과의 호환성을 위해
GenericClass<?> obj = new GenericClass<Object>(); 

, 그것은 의도적입니다 전혀 어떤 일반적인 정보가없는 클래스 (GenericClass없이 모든 <>)은 모두 일반 유형 안전을 잃어 버리기 때문에 사전 일반 코드로 안전하게 사용할 수 있습니다.

+0

고마워, 그게 내 속임수 였어! – chrert

+0

@LouisWasserman 설명 할 수 있습니다, 원시 형식으로 작동하지 않는 이유는 무엇입니까? 메소드의 반환 유형은 제네릭 유형과 독립적 인'Collection '입니다. – jlordo

+0

@jlordo JLS가 그렇게 말하기 때문에, "원시 타입의 사용은 _all_ 일반 타입 안전성을 제거합니다." –

4

다음 코드는 완벽하게 작동합니다. obj.getCollectionn()에서 값을 직접 추출하는 대신 변수에 저장 한 다음 액세스하는 것이 좋습니다.

GenericClass obj = new GenericClass(); 
Collection<String> c = obj.getCollection(); 
for (String string : c) 
{ 
    //Some complex Code 
} 
0

형식 매개 변수를 지정하지 않고 제네릭 형식의 인스턴스를 만드는 것은 레거시 코드에서만 수행해야하는 연습입니다. 작성중인 모든 새 코드는이를 수행하면 안됩니다. 이것은 "원시 타입"을 사용하여 호출되며, 처음에 일반 클래스를 작성한 모든 컴파일 타임 타입 안전성을 손상시킵니다.

또한 유용한 정보를 얻을 수 있기를 바랍니다. Collection 프레임 워크에서 자신 만의 가치 기반 클래스 인스턴스를 사용하려는 경우, equals() 및 hashcode()의 비헤이비어 구현. 이 작업을 수행하지 않고 equals() 및 hashcode()에 대한 Object 클래스의 기본 비헤이비어를 사용하면 개체가 컬렉션에서 제대로 작동하지 않을 수 있습니다.

관련 문제