我有一个抽象的泛型类,需要一个数字常量来初始化一个数组。我在使用该泛型类时在编译时知道数组的大小。有没有办法实现这个?
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个子节点。
答案 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);
}
}