如何制作我自己的自定义容器 - 没有默认构造函数

时间:2011-11-12 12:29:50

标签: java

我正在研究泛型,我想知道如何构建一个可以为我存储一些数据的参数化类。我想知道因为c ++对我的影响。其次,我想知道ArrayList是如何构建的。

我的问题是你不能创建一个没有默认构造函数的类的新实例,即Integer。我知道我应该专门研究我的课程,以便单独处理这些课程。但是,Java中没有像c ++那样的专业化。

如何更改代码

import java.lang.*;

class test {}

class generic<T> {
    private Class<T> type;
    T element;
    generic(Class<T> type) {
    this.type = type;
    try {
        element = type.newInstance();
    } catch (Exception e) {
        System.out.println("error " + e);
    }
    }
    static <T> generic<T> create(Class<T> type) {
    return new generic<T>(type);
    }
}

public class Generic {
    public static void main(String[] args) {
    generic<Test> test = generic.create(Test.class);
    System.out.println(test);
    }
}

以便它处理Integer而不是Test?

3 个答案:

答案 0 :(得分:1)

我觉得它看起来像这样

class MyArrayList<T> {
    static final int defaultSize = 10;
    Object[] array;
    int index;

    public MyArrayList() {
        array = new Object[defaultSize];
        index = 0;
    }

    public void add(T e) {
        if(index >= array.length) {
            Object[] temp = new Object[array.length*2];
            for(int i=0; i<array.length; i++) {
                temp[i]=array[i];
            }
            array = temp;
        }
        array[index++] = e;
    }

    public T get(int i) {
        return (T)array[i];
    }
}

答案 1 :(得分:1)

我对你班级的反应是试图做两件事。创建数据并存储数据。正如您在使用Integer类的经验中发现的那样,Java中有许多类不公开公共构造函数,更不用说默认构造函数了。因此,没有一种方法可以创建可以依赖的所有可能类型的对象实例。您声明您的要求是存储数据,因此我们将删除创建数据的责任:

class Test {
    public String toString() {
        return "test";
    }
}

class Generic<T> {
    private T element;

    Generic(T element) {
        this.element = element;
    }

    public String toString() {
        return element.toString();
    }
}

public class GenericTest {
    public static void main(String[] args) {
        Generic<Test> testGeneric = new Generic<Test>(new Test());
        System.out.println(testGeneric);

        Generic<Integer> integerGeneric = new Generic<Integer>(3);
        System.out.println(integerGeneric);
    }
}

至于想知道如何构建ArrayList,Java是开源的,因此您可以自由地检查所有SDK类型的实现方式。

答案 2 :(得分:1)

没有默认构造函数的

Integer与泛型无关,而且与它是一个不可变类这一事实无关。