2014-10-29 84 views
0

我得到以下错误:方法getOdometer & getGallons未定义类型对象。这是我的代码。我的问题是在主要的方法,在我使用我的访问器方法的while循环中。为什么这不起作用,我该如何解决?我是编程新手,所以不要给我任何太复杂的答案。谢谢您的回答。该方法未定义类型对象问题

我正在试图从一个文件中读取程序,并抓住里程表和加仑汽车在该里程表中填满。在我从FillUpArray辅助方法返回FillUp对象的数组列表后,我被告知使用辅助方法从文件中获取这些数字并计算主方法中的里程数。

package lab8; 
import java.io.File; 
import java.util.Scanner; 
import java.io.FileNotFoundException; 
import java.util.ArrayList; 


public class CheckpointOne { 
public static void main(String[] args) throws FileNotFoundException 
{ 
    File file = new File("C:/Users/Nick/workspace/project8/mileage.txt"); 
    Scanner scan = new Scanner(file); 
    double mileage=0.0; 
    int i=0; 
    while(i+1<fillUpArray(scan).size()) 
    { 
     mileage=(fillUpArray(scan).get(i+1).getOdometer()-fillUpArray(scan).get(i).getOdometer())/fillUpArray(scan).get(i+1).getGallons(); 
     System.out.println("Mileage: "+mileage); 
     i++; 
    } 
} 
    private static ArrayList fillUpArray(Scanner scan) 
    { 
     ArrayList<FillUp> list = new ArrayList<FillUp>(); 
     int odometer=0; 
     double gallons=0.0; 
     while(scan.hasNextLine()) 
     { 
      String line = scan.nextLine(); 
      Scanner scans = new Scanner(line); 
      while(scans.hasNext()) 
      { 
       odometer=scans.nextInt(); 
       gallons=scans.nextDouble(); 
      } 
      FillUp fill = new FillUp(odometer, gallons); 
      list.add(fill); 
     } 
     return list; 
    } 


} 

这是我正在使用的FillUp类。

package lab8; 

public class FillUp 
{ 
    private final int odometer; 
    private final double gallons; 

    public FillUp(int givenOdometer, double givenGallons) 
    { 
    odometer = givenOdometer; 
    gallons = givenGallons; 
    } 

    public int getOdometer() 
    { 
    return odometer; 
    } 

    public double getGallons() 
    { 
    return gallons; 
    } 
} 
+3

你正在返回一个原始'ArrayList'而不是一个通用'ArrayList '。 – Kayaman 2014-10-29 16:35:57

+0

类型删除再次罢工 – JonK 2014-10-29 16:41:56

回答

1

fillUpArray方法中,您创建并返回了ArrayList<FillUp>,但该方法的返回类型是原始类型ArrayList。因为它是未加工的,所以类型擦除表示原始ArrayList上的返回类型get将为Object,当然这没有那两种方法getOdometer()getGallons()

变化

private static ArrayList fillUpArray(Scanner scan) 

private static ArrayList<FillUp> fillUpArray(Scanner scan) 
1

你需要从fillUpArray()返回ArrayList<FillUp>

private static ArrayList<FillUp> fillUpArray(Scanner scan) 
         ^^^^^^^^ THIS 

没有这一点,您实际上返回的Object一个数组列表。

1
mileage=(fillUpArray(scan).get(i+1).getOdometer()-fillUpArray(scan).get(i).getOdometer())/fillUpArray(scan).get(i+1).getGallons(); 

上面一行试图使用一个实例Object类调​​用getOdometer() and getGallons()

在调用该方法之前,您必须贬低为FillUp对象。

修改后的代码将是:

mileage=((FillUp)fillUpArray(scan).get(i+1).getOdometer()-(FillUp)fillUpArray(scan).get(i).getOdometer())/(FillUp)fillUpArray(scan).get(i+1).getGallons(); 

注:最好的做法是根据需要返回的Objects相同的列表。

+0

Eclipse建议投它,但我不熟悉现在铸造,所以我没有这样做。 – NewbieNick 2014-10-29 17:19:02

+0

您必须这样做才能解决运行时发生的错误。 :)后,如果它的作品。 – Joshi 2014-10-29 17:26:34

1

问题是您在静态方法返回的值中使用原始类型 private static ArrayList fillUpArray(Scanner scan)。原始类型允许指定一个集合,而不需要定义构建集合上的泛型类型。你可以看看原始类型here。它允许维护与最早的JVM(版本< 5.0)的兼容性。

因此,如果您使用原始类型,则强制使用集合来使用投射到对象的项目。在这种情况下,您定义fillUpArray(Scanner scan)返回ArrayList元素,并且我已经提到它是原始类型。因此,您可以像ArrayList一样管理返回值。

当然,dynamic binding定义在运行时,消息将被发送到目标对象FillUp在这种情况下。但是,此元素的类型在静态时间内解决。因此,编译器检查由fillUpArray返回的Array的元素的静态类型,并且您使用了原始类型,因此动态类型将解析为Object.class。编译器发现Object元素不包含任何称为fillUpArray的方法。

的解决方案,您可以更改方法形式的签名:

private static ArrayList fillUpArray(Scanner scan). 

private static ArrayList< FillUp> fillUpArray(Scanner scan). 

你可以看到动态和静态类型的a similar example

相关问题