我正在尝试实现通用数据类型的向量,其中类型被视为来自用户的输入,例如:
package com.example.genericvector;
import java.util.Scanner;
public class GenericVector <generic_type>{
private int length;
private generic_type [] vector;
GenericVector(generic_type element){
this.vector[0] = element;
}
public void allocate_size(int length){
}
public void push_back(generic_type element){
}
public void display(generic_type [] vector){
for(generic_type element : vector)
System.out.print(element);
System.out.println();
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Enter the data type of vector : ");
String vector_type = scanner.next();
switch (vector_type){
case "integer":
GenericVector <Integer> vector_int = new GenericVector <Integer>(new Integer(10));
break;
case "double":
GenericVector <Double> vector_double = new GenericVector <Double>(new Double(10.57));
break;
default:
System.out.print("Invalid data type");
}
}
}
运行上面的代码后,我得到以下输出:
Enter the data type of vector : integer
Exception in thread "main" java.lang.NullPointerException
at com.example.genericvector.GenericVector.<init>(GenericVector.java:12)
at com.example.genericvector.GenericVector.main(GenericVector.java:40)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
Process finished with exit code 1
我对Java很新,所以任何帮助都会非常感激。
答案 0 :(得分:1)
private generic_type [] vector;
只有声明您的通用类型的字段(数组)。但最初,数组 null 。
像
这样的东西private generic_type [] vector = new generic_type[10];
使用新向量初始化该字段(但请注意,此时各个数组插槽都 null )。但是,uups,评论员是正确的...这是泛型和数组的缺陷之一,你不能使用new []作为泛型类型。另一方面,数组在Java中具有固定的大小;所以你必须经常检查你是否必须增长/缩小底层阵列!因此,工作解决方案可能是:
private List<T> vector = new ArrayList<>();
例如(使用现有的Java集合类)。
最后注释:按照惯例,泛型类型使用单个上层字符表示。因此它应该是GenericVector<T>
而不是generic_type
。
答案 1 :(得分:0)
您没有初始化数组vector
,因此this.vector[0]
将抛出NullPointerException。
在这里查看如何创建通用数组实例:How to create a generic array in Java?
编辑:你的构造函数或allocate_size()方法将包含如下内容:
vector = (generic_type[]) Array.newInstance(element.getClass(), length);
另请注意,您需要为数组提供一个长度,因此在构造函数中,您必须初始化调用数组的长度至少为1,否则vector[0]
将导致ArrayIndexOutOfBoundsException。< / p>