2015-01-21 4 views
1

기본적으로 마우스 클릭이 다양한 유형의 사각형 목록 (G3_gRect의 모든 하위 항목) 중 하나에 속하는지 여부를 찾기 위해 일반 검색 기능을 구현하려고합니다. 아무 것도 발견되지 않으면, 그것은 유형이 T 인 새 오브젝트를 유효하지 않은 것으로 정의하는 특성으로 리턴해야합니다 (다른 오브젝트와는 달리).새 제한 유형 매개 변수 만들기

제네릭 형식 T를 반환 할 때까지이 모든 내용이 제대로 작동합니다. 이 작업을 수행하려면 어떻게해야합니까?

T 형식의 새 개체를 초기화 할 때 마지막 줄이 끊어집니다. 항상 해당 형식을 초기화 할 수 있는지 여부를 모르기 때문에 가정합니다.

private <T extends G3_gRect> T whatRect(MouseEvent e, List<List<T>> maps) { 
     while (!maps.isEmpty()) { 
      List<T> map = maps.remove(0); 

      for (T entry : map) { 
       if(entry.R.contains(e.getPoint())) return entry;     
      } 
     } 
     return new T(G2_gObj.ObjType.NONE); //return with empty object rather than null. 
    } 

관련 클래스의 관련 부분의 몇

:
public abstract class G2_gObj { 

public enum ObjType { 
    FUNCTION, RIBBON, D_LINE, D_START, D_END, D_IN_AREA, C_IN_AREA, M_IN_AREA, D_OUT_AREA, M_OUT_AREA, NONE, C_OUT_AREA 
} 

public ObjType t; 

public G2_gObj(ObjType t) { 
    this.t = t; 
} 
} 

public class G3_gRect extends G2_gObj{ 
public G3_gRect(ObjType t) { 
    super(t); 
} 
} 

public class G4_gFunct extends G3_gRect{ 
public G4_gFunct(ObjType t) { 
    super(t); 
} 
} 

public class G4_gDPoint extends G3_gRect{ 
public G4_gFunct(ObjType t) { 
    super(t); 
} 
} 

지금 내 해결 방법은 아무 것도 발견되지 않으면 반환이 방법으로 T 타입의 객체에 전달하는 것입니다

. 괜찮습니다.하지만 실제로이 작업을 수행하는 더 좋은 방법이 있다고 상상합니다.

감사합니다.

답변

2

정확한 클래스를 모른 채 개체를 구성 할 방법이 없습니다. 리플렉션을 사용하지 않는 유일한 방법은 발신자에게 기본값을 전달하거나 null (불필요한 객체 생성을 피할 수 있음)을 반환하는 것입니다.

당신이 반사 (의심 결정을) 사용하려는 경우, 당신은 매개 변수 Class<T> clazz 있고, 반환 할 수

clazz.getConstructor(ObjType.class).newInstance(G2_gObj.ObjType.NONE)