Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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_Arrays_Generics - Fatal编程技术网

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]`但是如果我把它公之于众,那么试着插入并重新保存数据,是吗