我正在寻求实现一个通用搜索功能,主要是查看鼠标单击是否在多个矩形列表之一内(不同类型,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 的对象传递到此方法中,如果没有找到任何内容则返回。它有效,很好,但我想有更好的方法来真正实现这项工作。
谢谢!
最佳答案
如果不知道对象的确切类,就无法构造它。除非使用反射,您唯一的选择是让调用者传递默认值,或者返回 null
(这将避免不必要的对象创建)。
如果你确实想使用反射(一个有问题的决定),你可以有一个参数 Class<T> clazz
,然后返回
clazz.getConstructor(ObjType.class).newInstance(G2_gObj.ObjType.NONE)
关于java - 创建新的有界类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28077041/