创建新的有界类型参数

时间:2015-01-21 21:20:21

标签: java bounded-types

我希望实现一个通用的搜索功能,基本上看一下鼠标点击是否在几个矩形列表中的一个(不同类型的矩形,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的对象传入此方法,以便在找不到任何内容时返回。它运作良好,但我认为有更好的方法来实现这项工作。

谢谢!

1 个答案:

答案 0 :(得分:2)

如果不知道确切的类,就无法构造对象。除非使用反射,否则唯一的选择是让调用者传递默认值,或返回null(这将避免不必要的对象创建)。

如果你想使用反射(一个有问题的决定),你可以有一个参数Class<T> clazz,并返回

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