2014-10-29 44 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

相關問題