我正在研究泛型,我想知道如何构建一个可以为我存储一些数据的参数化类。我想知道因为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?
答案 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
与泛型无关,而且与它是一个不可变类这一事实无关。