在Java中实例化一个通用的Number类

时间:2014-03-26 20:41:39

标签: java generics

我正在尝试创建一个可以存储Number类型的类似数组的对象。 我想将Object[] array中的每个值初始化为0。 如果我知道NegativeArray正在存储Integer s, 然后我可以做new Integer(0)。 不幸的是,在处理泛型E时, 我不知道如何创建值Number的新0

这是我目前的实施:

package com.gly.sfs.util;

public class NegativeArray <E extends Number> {

    private int firstIndex;
    private int lastIndex;
    private Object[] array;

    public NegativeArray(int firstIndex, int lastIndex) {
        this.firstIndex = firstIndex;
        this.lastIndex = lastIndex;

        boolean isValid = lastIndex > firstIndex; 
        if (!isValid) {
            throw new IllegalArgumentException(
                    "lastIndex > firstIndex violated!");
        }

        array = new Object[size()];
    }

    public void set(int index, E e) {
        checkIndexValidity(index);
        array[getIndex(index)] = e;
    }

    public E get(int index) {
        checkIndexValidity(index);
        @SuppressWarnings("unchecked")
        E e = (E) array[getIndex(index)];
        return e;
    }

    public int size() {
        return lastIndex - firstIndex;
    }

    private int getIndex(int index) {
        return index - firstIndex;
    }

    private void checkIndexValidity(int index) {
        boolean isValid = (index >= firstIndex) & 
                (index < lastIndex);
        if (!isValid) {
            throw new ArrayIndexOutOfBoundsException();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您需要的不仅仅是E:您需要一份单独的合同,其中E具有getZero()方法,或者您需要单独接受getZero方法。< / p>

在Java 8中,除了构造函数中的其他参数之外,您还可以接受Supplier< E >,并且可以为常见的Supplier子类提供一些库存Number。< / p>

在Java 7及更早版本中,您可以手动定义ZeroSupplier<E>接口。