Java 如何创建自己的自定义容器-无默认构造函数
我现在正在学习泛型,我想知道如何构建一个参数化类来为我存储一些数据。我想知道因为C++对我的影响。其次,我想知道ArrayList是如何构建的 我的问题是,不能创建没有默认构造函数的类的新实例,即Integer。我知道我应该对我的类进行专门化,以便单独处理这些类。但是,在C++中没有专门化的java。 我如何修改代码Java 如何创建自己的自定义容器-无默认构造函数,java,Java,我现在正在学习泛型,我想知道如何构建一个参数化类来为我存储一些数据。我想知道因为C++对我的影响。其次,我想知道ArrayList是如何构建的 我的问题是,不能创建没有默认构造函数的类的新实例,即Integer。我知道我应该对我的类进行专门化,以便单独处理这些类。但是,在C++中没有专门化的java。 我如何修改代码 import java.lang.*; class test {} class generic<T> { private Class<T> ty
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);
}
}
import java.lang.*;
类测试{}
类泛型{
私人阶级类型;
T元素;
泛型(类类型){
this.type=type;
试一试{
element=type.newInstance();
}捕获(例外e){
系统输出打印项次(“错误”+e);
}
}
静态泛型创建(类类型){
返回新的泛型(类型);
}
}
公共类泛型{
公共静态void main(字符串[]args){
generic test=generic.create(test.class);
系统输出打印LN(测试);
}
}
所以它处理整数而不是测试?我认为它看起来像这样
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];
}
}
类MyArrayList{
静态最终int defaultSize=10;
对象[]数组;
整数指数;
公共MyArrayList(){
数组=新对象[defaultSize];
指数=0;
}
公共无效添加(TE){
如果(索引>=array.length){
Object[]temp=新对象[array.length*2];
对于(int i=0;i我对您的类的反应是它试图做两件事。创建数据并存储数据。正如您使用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);
}
}
类测试{
公共字符串toString(){
返回“测试”;
}
}
类泛型{
私有T元素;
通用(T元素){
this.element=元素;
}
公共字符串toString(){
返回元素.toString();
}
}
公共类通用测试{
公共静态void main(字符串[]args){
Generic testGeneric=new Generic(new Test());
System.out.println(testGeneric);
泛型整数泛型=新泛型(3);
System.out.println(integerGeneric);
}
}
至于想知道如何构建ArrayList
,Java是开源的,因此您可以自由地检查所有SDK类型是如何实现的。Integer
没有默认构造函数与泛型无关,而与它是一个不可变类这一事实有关。您的解决方案存在一个问题,即它会发出一个警告一些动作是不安全的。我想它是关于C++的。我想看看java应该如何正确编写——没有任何注意。BTW。在我看来,我很奇怪,在你的课堂上,我不能用原语作为参数,尽管它们完全适合(在我的C++影响下)。。您可以使用@SuppressWarnings(“未选中”)来避免警告你不能在泛型中使用原语。这是因为在java中,泛型是语法糖,而C++中,从模板中生成了一个新类。如果你想知道ArrayList是如何工作的,那么就读一下源代码?为什么你的容器需要创建它要创建的类型的新实例?还有。类名应该是大写
,就像测试
和泛型
一样,以遵循Java标准惯例。我不知道Java是开源的……否则我永远不会问这个问题。现在我感到非常失望,因为我相信当有人在泛型上投入如此多的精力时,他们会用它来实现实际上,他们只会抑制警告…+1 @ Lord.DigGER:java泛型允许编译器在编译时验证编译器生成的转换不会在运行时失败。