为啥我在编译时收到以下错误:[关闭]

Posted

技术标签:

【中文标题】为啥我在编译时收到以下错误:[关闭]【英文标题】:Why i am getting the following error in compilation: [closed]为什么我在编译时收到以下错误:[关闭] 【发布时间】:2018-01-22 08:24:13 【问题描述】:

在下面的代码中,我在 Test_1 “System.out.println(set1.get(0).get(0).txt);”的最后第二行中遇到错误在“txt”中请帮助。 java error screenshot

import java.util.ArrayList;

public class Test_1 


/** 
 * @param args the command line arguments 
 */ 
public static void main(String[] args)  
     ArrayList<ArrayList> set1 = new ArrayList<>(); 
    ArrayList<abc> set2 = new ArrayList<>(); 
    ArrayList<abc> set3 = new ArrayList<>(); 

    set1.add(set2); 
    set1.add(set3); 
    set2.add(new abc("xxxxxx")); 
    set2.add(new abc("xxxxx yyyyy")); 
    System.out.println(set2.get(0).txt); 
    System.out.println(set1.get(0).get(0).txt);
    System.out.println(((abc) set1.get(0).get(0)).txt); 
 

 


class abc
 String txt;  
 public abc(String txt)
  
    this.txt = txt; 
   
 

【问题讨论】:

请edit您的问题确保所有代码格式正确。另外,将错误作为文本包含在链接图像中,并在代码中标记出现错误的行。 你需要调用方法名,而不是变量名。 .txt 不是Object 的字段。命名不佳的变量set1 应该是ArrayList&lt;ArrayList&lt;abc&gt;&gt; 类型。永远不要使用原始类型。 您已经在下一行代码上解决了问题。您的非泛型 ArrayList 默认不是 abc 类型,但您可以将元素转换为该类型。 这里真正的重点是:这是基本的语法。不要尝试反复试验。阅读一本好书或教程,并遵循它——而不是“发明”你自己的语法。 【参考方案1】:

查看 set1 并将其与 set2 进行比较注意,在第二种情况下,您指定了 set2 将持有的对象类型,但在 set1 中您没有,因此编译器不知道您使用的是 abc 类(通过方式类名应该以大写开头)。这是解决方案

  public static void main(String[] args) 
    ArrayList<ArrayList<abc>> set1 = new ArrayList<>(); // notice this line
    ArrayList<abc> set2 = new ArrayList<>();
    ArrayList<abc> set3 = new ArrayList<>();

    set1.add(set2);
    set1.add(set3);
    set2.add(new abc("xxxxxx"));
    set2.add(new abc("xxxxx yyyyy"));
    System.out.println(set2.get(0).txt);
    System.out.println(set1.get(0).get(0).txt);
    System.out.println(((abc) set1.get(0).get(0)).txt);

【讨论】:

【参考方案2】:

因为您没有为第一个 set1 中的 Generic 提供类型,所以当您从 set1 获取时,您不会保证返回的列表是 abc 列表,这会使您的语法检查器感到困惑。

考虑

 ArrayList<ArrayList> set1 = new ArrayList<>();

对比

 ArrayList<ArrayList<abc>> set1 = new ArrayList<>();

【讨论】:

没有。它肯定不会编译得很好。它不是“混淆语法检查器”,原始get 方法的返回值只是ObjectObject 没有名为 txt 的字段。

以上是关于为啥我在编译时收到以下错误:[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在第二次运行测试时在 Mongoose 中收到错误“一旦编译后无法覆盖模型”?

Qt 创造者。为啥我在编译发布版本时收到有关 glut 的错误,但没有调试?

为啥类中的 stringstream 成员会导致编译时错误? [复制]

为啥我会收到错误“不安全代码可能仅在使用 /unsafe 编译时出现”?

为啥我在使用 ActionBar Sherlock 和旧版 android 版本时在 onCreate() 处收到错误? [关闭]

为啥我在写 = 而不是 == 时没有收到警告?