создать новый параметр ограниченного типа

Я пытаюсь реализовать общую функцию поиска, чтобы в основном посмотреть, находится ли щелчок мыши в одном из нескольких списков прямоугольников (разных типов, все дочерние элементы 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 в этот метод, чтобы вернуться, если ничего не найдено. Это работает, это нормально, но я думаю, что есть лучший способ заставить это работать.

Спасибо!


person John    schedule 21.01.2015    source источник


Ответы (1)


Невозможно построить объект, не зная его точного класса. За исключением использования отражения, ваш единственный вариант - передать вызывающему объекту значение по умолчанию или вернуть null (что позволит избежать ненужного создания объекта).

Если вы хотите использовать отражение (сомнительное решение), вы можете указать параметр Class<T> clazz и вернуть

clazz.getConstructor(ObjType.class).newInstance(G2_gObj.ObjType.NONE)
person shmosel    schedule 21.01.2015