对于Object类型问题,该方法未定义

时间:2014-10-29 16:34:49

标签: java

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

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

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

4 个答案:

答案 0 :(得分:2)

fillUpArray方法中,您创建并返回了ArrayList<FillUp>,但该方法的返回类型是原始类型ArrayList。因为它是原始的,所以类型擦除表明原始get上的ArrayList的返回类型将为Object,这当然没有getOdometer()和{{getGallons() 1}}。

更改

private static ArrayList fillUpArray(Scanner scan)

private static ArrayList<FillUp> fillUpArray(Scanner scan)

答案 1 :(得分:1)

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

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

如果没有这个,你实际上会返回Object的数组列表。

答案 2 :(得分:1)

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

上述代码尝试使用实例getOdometer() and getGallons()类调用Object

在调用该方法之前,您必须向下转换为FillUp对象。

修改后的代码为:

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

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

答案 3 :(得分:1)

问题是您在静态方法返回的值中使用了原始类型 private static ArrayList fillUpArray(Scanner scan)。原始类型允许指定集合而不定义集合上的泛型类型。您可以查看原始类型here。它允许维护与最旧的JVM(版本&lt; 5.0)的兼容性。

因此,如果您使用原始类型,则强制将其集合用于使用正在转换为Object的项目。在这种情况下,您定义fillUpArray(Scanner scan)返回ArrayList元素,我已经提到它是原始类型。因此,您可以像ArrayList一样管理返回值。

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

解决方案,您可以更改方法表单的签名:

private static ArrayList fillUpArray(Scanner scan). 

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

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