java - 创建新的有界类型参数

标签 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 的对象传递到此方法中,如果没有找到任何内容则返回。它有效,很好,但我想有更好的方法来真正实现这项工作。

谢谢!

最佳答案

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

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

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

关于java - 创建新的有界类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28077041/

相关文章:

java - Class.getResourceAsStream() 问题

java - 更改列表项背景边框的颜色

Java 接口(interface)层次结构及其具有有界类型泛型的方法

haskell - 用于转换为有界积分的 Prism

java - 如果默认接受子类对象,为什么要在泛型中使用有界类型参数?

java - 从文本文件生成源代码

Java-17 - 切换案例 - 应删除未使用的方法参数

java - 为什么我收到错误 "variable ' 颜色可能尚未初始化? java