JAVA:泛型类型编译时常量

4

我有一个抽象的泛型类,需要一个数字常量来初始化数组。当我使用这个泛型类时,我在编译时知道数组的大小。有没有办法实现这个要求?

abstract class Node<T, MagicN> {

    private T parent    = null;
    private T[] child   = (T[]) new Object[MagicN];

    //some methods that rely on the initialized array.

}
final class ConcreteNode extends Node<ConcreteNodeType, 2> {

}

在这个例子中,类ConcreteNode有2个子节点。

1
什么?你的问题真的不明确。 - Anubian Noob
这不是有效的:private T[] child = (T[]) new Object[MagicN]; - Haifeng Zhang
我想用通用的常量值来初始化数组。我无法更好地解释 :( - barsdeveloper
来吧,我知道这不是有效的,这就是我将其命名为MAGIC的原因!这只是一个例子。 - barsdeveloper
你可以在构造函数中进行初始化,使用通用类进行初始化不是一个好主意。MagicN实际上是Integer - Haifeng Zhang
显示剩余3条评论
3个回答

1

你不能将泛型用作模板。由于 Java 的代码优化是在运行时完成的,因此几乎没有理由在编译时进行内联操作。

abstract class Node<T extends Node> {

    private final T parent;
    private final T[] child;

    Node(T parent, int size) {
        this.parent = parent;
        child = (T[]) new Object[size];
    }

    //some methods that rely on the initialized array.

}
final class ConcreteNode extends Node<ConcreteNode> {
     ConcreteNode(ConcreteNode parent) {
         super(parent, 2);
     }
}

0

你不能使用值替代泛型类型(否则你应该为每个可能使用的值创建一个类...)
我认为在你的情况下最好的方法是有一个以这个值作为参数的构造函数,例如:

abstract class Node<T> {

    private T parent    = null;
    private int MagicN = 0;
    private T[] child   = null;

    protected Node(int MagicN)
    {
        this.MagicN = MagicN;
        this.child = (T[]) new Object[MagicN];
    }

    //some methods that rely on the initialized array.

}

final class ConcreteNode extends Node<ConcreteNodeType> {
    public ConcreteNode()
    {
        super(2);
    }
}

就性能而言,您正在尝试做的事情与此示例没有区别,因为您的子数组是在对象上下文中初始化而不是静态上下文中初始化的。

-1

为什么不这样做呢?

abstract class Node<T> {
    private T parent    = null;
    private T[] child;

    public Node(int childCount) {
        child = (T[]) new Object[childCount];

    //some methods that rely on the initialized array.

}
final class ConcreteNode extends Node<ConcreteNodeType> {
    public ConcreteNode()
    {
        super(2);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接