我希望实现一个通用的搜索功能,基本上看一下鼠标点击是否在几个矩形列表中的一个(不同类型的矩形,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的对象传入此方法,以便在找不到任何内容时返回。它运作良好,但我认为有更好的方法来实现这项工作。
谢谢!
答案 0 :(得分:2)
如果不知道确切的类,就无法构造对象。除非使用反射,否则唯一的选择是让调用者传递默认值,或返回null
(这将避免不必要的对象创建)。
如果你想使用反射(一个有问题的决定),你可以有一个参数Class<T> clazz
,并返回
clazz.getConstructor(ObjType.class).newInstance(G2_gObj.ObjType.NONE)