为什么我在编译中收到以下错误:

时间:2017-08-14 13:21:04

标签: java arraylist

在下面的代码中,我在Test_1的第二行和#34; System.out.println(set1.get(0).get(0).txt);" in" 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; 
 }  
 }

3 个答案:

答案 0 :(得分:-1)

因为你没有在第一个set1中给出Generic的类型,所以当你从set1获得时,你不会想到你要回来的列表是一个abc列表,而且你的语法检查器很混乱。

考虑

            if (urlDictionary.ContainsKey(url.Authority))
            {
                urlDictionary[url.Authority].Add(url);
            }
            else
            {
                urlDictionary.Add(url.Authority, new List<Uri> { url });
            }

Vs以上。

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

答案 1 :(得分:-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 :(得分:-1)

问题在于您set1

的声明
ArrayList<ArrayList> set1 = new ArrayList<>();

你说set1是一个数组列表的数组列表......是什么?您没有指定set1的数组列表是什么类型的数组列表。在这种情况下,Java会假设您的意思是Object。因此,set1基本上是ArrayList<ArrayList<Object>>

现在您尝试set1.get(0).get(0)。你会得到什么?一个Object(由于多态性,实际上abc,但编译器并不知道这一点)! Object是否有一个名为text的字段?编号错误!

现在您已了解错误发生的原因,您应该能够解决它。

  

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

现在你已经修好了,现在你不需要在下一行进行演员表了:

System.out.println(((abc) set1.get(0).get(0)).txt); 
//                  ^^^^^
//             don't need this

你可以这样写:

System.out.println(set1.get(0).get(0).txt);