当前位置: 首页 > 知识库问答 >
问题:

我可以从创建泛型类的对象的main方法访问插入数据吗

郏稳
2023-03-14

对不起,我编辑了我的代码使其简单。

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 
   }
}

共有1个答案

燕超
2023-03-14

这是一个奇怪的情况,可能是一个bug。然而,这是相当没有意义的--这不是正确的做法。你犯了多种风格违规行为;一些不重要的东西,也不是99.9%的java代码的编写方式。当您重写代码时,这个问题就消失了:

>

  • object[]转换为t[]是完全错误的,编译过程中得到的警告试图告诉您现在代码中存在错误。object[]不是t[]:与list 不同,在list 中不能返回字符串部分,而在数组中可以:arr.getclass().getcomponenttype()。在这种情况下(当您需要一个泛型集合时),正确的方法是根本不使用数组,而使用列表 。如果必须使用数组,那么正确的方法是只使用object[]数组,并在每次需要时强制转换。例如,Java自己的ArrayList就是这样编写的。记住,数组和泛型不能一起工作,所以不要尝试。如果你这样做,你就会得到类似这样的疯狂错误,这证明你不应该这样做。

    更一般地说,您不应该有公共字段。尤其是像arr这样的hack/lie字段。公共数组通常是一个非常糟糕的想法;您不能使它们不变或不可修改,所以如果这样做,您真的放弃了保持对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!
         }
     }
    

    注意:然而,调用.length到由于泛型冲突而导致类型没有实际对齐的数组上最终导致CCEx是很奇怪的。但是,您在编译过程中得到的警告呢?它给了编译器实现这一目标的“权利”,所以虽然很奇怪,但它不是严格意义上的bug,并且试图在例如bugs.openjdk.net上报告这一错误,99%的可能性被忽略或忽略为“按预期工作”;WontFix'。唯一可行的路径是不要将Object[]强制转换为T[],因为Object[]不是T[]。通常,在任何地方使用t[]都是错误的。

  •  类似资料:
    • 我正在开发一个计算圆形和方形(类)面积的小练习java程序,该程序实现了surface(接口),它有一个名为area()的方法。我需要实现一个名为SumArea的类,该类有一个名为Calcrea()的通用方法,该方法接收Circle circ[]和Square Square[]数组,并执行面积计算 程序结构: - urface.java quare.java 圆圈java rea.java 我怀疑

    • 我有很多实体扩展了实体,也有很多数据扩展到 我有一个通用的存储库、服务和映射器,如下所示 我的仓库: 我的服务: 我的地图绘制者: 我想在方法中从T创建一个对象,在类中从方法中从Dto创建一个对象

    • 问题内容: 大家好!我有一个简单的问题。…为什么我可以从main方法中获得一个私有变量?我知道,我在包含类中,但这是主要的。我相信主体不是包含它的类的一部分……那么我不会去找私人成员,但是我可以……为什么?请帮助… thx 问题答案: Main是您的类的一部分,您已经在类中声明了它:) main不是您的对象的一部分,它不会是您从该类创建的对象的任何部分,但它仍然是该类的一部分。这对于任何静态函数都

    • 我有以下java示例类: 它正在生成编译器警告: 类型安全:从捕获#1-of?扩展对象到T的未检查强制转换 我完全可以得到精确的T对象,如果我这样做: 它完全知道这是T型的。 为什么我不能创建该类的新实例?我怎样才能修复它? (我没有查找类型为“Add@SuppressWarnings(“unchecked”)”的响应)

    • 我一直在玩新的ES6地图(),只是为了适应它,现在我们可以得到大小了,我突然想到可以有效地随机抽取地图样本,看看它是什么样子的。 显然,可以迭代遍历,将所有条目组成一个数组,然后选择随机样本。但这对大地图来说没有吸引力。 最后有一些代码通过利用地图的新可用大小来实现这一点。它比复制的效率稍高,但仍然没有吸引力。 但是Map方法keys()返回一个迭代器对象,我们通常使用它的next()方法来迭代M

    • 我是java初学者,我不理解这行代码是什么意思 平均值。为什么不能访问自己的方法。请详细解释如果类A正在实例化,那么为什么它的方法不可访问。