JAVA:通用类型编译时常量

时间:2014-05-21 15:58:00

标签: java generics numbers constants

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

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个子节点。

3 个答案:

答案 0 :(得分:0)

您不能将Generic用作模板。由于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);
     }
}

答案 1 :(得分: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);
    }
}

在性能方面,您尝试执行的操作和此示例之间没有区别,因为您的子数组在对象上下文中初始化而不是静态数组。

答案 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);
    }
}