Java 我可以从创建泛型类对象的主方法中插入数据吗
很抱歉,我编辑了代码以使其简单。Java 我可以从创建泛型类对象的主方法中插入数据吗,java,arrays,generics,Java,Arrays,Generics,很抱歉,我编辑了代码以使其简单。 class ClassExampleOfGeneric<T>{ public T[] arr = (T[]) new Object[3] ; } public class Generic { public static void main(String[] args) { var x = new ClassExampleOfGeneric<String>();
class ClassExampleOfGeneric<T>{
public T[] arr = (T[]) new Object[3] ;
}
public class Generic {
public static void main(String[] args) {
var x = new ClassExampleOfGeneric<String>();
x.arr[0]="hjgh"; // can I insert "String" at the end "new Object[3]" converted into string array
x.arr[1]"lol";
x.arr[2]="mnasdas";
System.out.println(x.arr.length); //<--- Here can i retrive from array
}
}
class ClassExampleOfGeneric{
公共T[]arr=(T[])新对象[3];
}
公共类泛型{
公共静态void main(字符串[]args){
var x=新的ClassExampleOfGeneric();
x、 arr[0]=“hjgh”;//是否可以在转换为字符串数组的“新对象[3]”末尾插入“字符串”
x、 arr[1]“lol”;
x、 arr[2]=“mnasdas”;
System.out.println(x.arr.length);//这是一个奇怪的情况,可能是一个bug。但是,这是一个相当没有意义的问题-这不是正确的方法。您正在犯下多种样式的违规行为;这些行为不是必需的,并且不是所有java代码99.9%的编写方式。当您重写代码时,这个问题就会消失:
将Object[]
强制转换为T[]
完全是错误的,编译过程中得到的警告是试图告诉您现在代码中存在谎言。Object[]
不是T[]
:与使用(例如,List
)不同,在使用数组时,您无法将字符串部分取出来:arr.getClass().getComponentType()
。在这种情况下,正确的方法(当您需要一个通用集合时)根本不使用数组,而是使用例如列表
。如果必须使用数组,那么正确的方法就是只使用对象[]
array,并在每次需要时进行强制转换。例如,java自己的ArrayList
就是这样编写的。记住,数组和泛型不能一起工作,所以不要尝试。如果这样做,就会出现类似这样的疯狂错误,这就是不应该这样做的证据
更一般地说,您不应该有公共字段。尤其是一个hack/a-lie字段,如arr
。公共数组通常是一个非常糟糕的主意;您不能使它们不可变或不可修改,因此如果您这样做,您就真的失去了控制API的机会。它也不是惯用的java代码
最简单的解决方案:
class ClassExampleOfGeneric<T> {
private Object[] arr = new Object[3];
public void add(T item) {
arr[2] = item ;
}
public void getArrEle() {
for(int i=0;i<3;i++){
System.out.println(arr[i]);
}
}
public T get(int idx) {
return (T) arr[i]; // cast here!
}
}
class ClassExampleOfGeneric{
私有对象[]arr=新对象[3];
公共作废新增(T项){
arr[2]=项目;
}
公共空间{
对于(int i=0;i来说,这是一个奇怪的情况,可能是一个bug。但是,这是一个相当没有意义的问题-这不是正确的方法。您正在犯多个样式冲突;这些都不是必需的,并且不是99.9%的java代码的编写方式。当您重写代码时,这个问题就消失了:
将Object[]
强制转换为T[]
完全是错误的,编译过程中得到的警告是试图告诉您现在代码中存在谎言。Object[]
不是T[]
:与使用(例如,List
)不同,在使用数组时,您无法将字符串部分取出来:arr.getClass().getComponentType()
。在这种情况下,正确的方法(当您需要一个通用集合时)根本不使用数组,而是使用例如列表
。如果必须使用数组,那么正确的方法就是只使用对象[]
array,并在每次需要时进行强制转换。例如,java自己的ArrayList
就是这样编写的。记住,数组和泛型不能一起工作,所以不要尝试。如果这样做,就会出现类似这样的疯狂错误,这就是不应该这样做的证据
更一般地说,您不应该有公共字段。尤其是一个hack/a-lie字段,如arr
。公共数组通常是一个非常糟糕的主意;您不能使它们不可变或不可修改,因此如果您这样做,您就真的失去了控制API的机会。它也不是惯用的java代码
最简单的解决方案:
class ClassExampleOfGeneric<T> {
private Object[] arr = new Object[3];
public void add(T item) {
arr[2] = item ;
}
public void getArrEle() {
for(int i=0;i<3;i++){
System.out.println(arr[i]);
}
}
public T get(int idx) {
return (T) arr[i]; // cast here!
}
}
class ClassExampleOfGeneric{
私有对象[]arr=新对象[3];
公共作废新增(T项){
arr[2]=项目;
}
公共空间{
for(int i=0;i的答案解释了这个问题,最好在使用泛型时选择List
实现。但是作为一种解决方法,如果在ClassExampleOfGeneric
中添加一个长度获取方法,那么就不会出现错误
public int getLength(){
返回arr.length;
}
的答案解释了这个问题,最好在使用泛型时选择列表
实现。但是作为一种解决方法,如果在ClassExampleOfGeneric
中添加一个长度获取方法,则不会出现错误
public int getLength(){
返回arr.length;
}
-我尝试添加一个方法来检索类中的长度。但效果很好。知道它为什么没有抛出错误吗?@rzwitserroot首先我是新的java,我编辑了我的代码。你能重新查看我的代码吗?我知道我的代码中有什么错误,这应该是'private T[]arr=(T[])new Object[3]`但是如果我把它公诸于众,那么试着插入并重新保存数据,有可能吗?.正如我告诉你的,Wasim,你不能有t[]
,不需要它,它会导致一大堆麻烦。泛型和数组不能很好地相互作用,这只是一个事实,不能通过代码欺骗来解决。我在本例中向您展示了如何避免T[]首先。-我尝试添加一个方法来检索类中的长度。但效果很好。知道它为什么没有抛出错误吗?@rzwitserroot首先我是新的java,我编辑了我的代码。你能重新查看我的代码吗?我知道我的代码中有什么错误,这应该是'private T[]arr=(T[])new Object[3]`但是如果我把它公之于众,那么试着插入并重新保存数据,是吗