Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何创建自己的自定义容器-无默认构造函数_Java - Fatal编程技术网

Java 如何创建自己的自定义容器-无默认构造函数

Java 如何创建自己的自定义容器-无默认构造函数,java,Java,我现在正在学习泛型,我想知道如何构建一个参数化类来为我存储一些数据。我想知道因为C++对我的影响。其次,我想知道ArrayList是如何构建的 我的问题是,不能创建没有默认构造函数的类的新实例,即Integer。我知道我应该对我的类进行专门化,以便单独处理这些类。但是,在C++中没有专门化的java。 我如何修改代码 import java.lang.*; class test {} class generic<T> { private Class<T> ty

我现在正在学习泛型,我想知道如何构建一个参数化类来为我存储一些数据。我想知道因为C++对我的影响。其次,我想知道ArrayList是如何构建的

我的问题是,不能创建没有默认构造函数的类的新实例,即Integer。我知道我应该对我的类进行专门化,以便单独处理这些类。但是,在C++中没有专门化的java。

我如何修改代码

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泛型允许编译器在编译时验证编译器生成的转换不会在运行时失败。