2013-03-14 82 views
-1

我試圖做一個通用觀察者模式,模仿headFirst設計模式示例。在標有行的錯誤處出現???下面。通用觀察員 - 鑄造問題

錯誤消息指出:在類型主題的方法registerObserver(觀察者)是不適用的參數(CurrentConditionsDisplay)

package be.intec.Meteo.Codemeteo; 

import be.intec.Meteo.Interfaces.DisplayElement; 
import be.intec.Meteo.Interfaces.Observer; 
import be.intec.Meteo.Interfaces.Subject; 
//import javax.servlet.annotation.WebServlet; 

//@supressWarning("unchecked") 
public class CurrentConditionsDisplay implements Observer, DisplayElement { 
    private float temperature; 
    private float humidity; 
    private Subject weatherData; 

    public CurrentConditionsDisplay(Subject weatherData) { 
     this.weatherData = weatherData; 
      weatherData.registerObserver(this); // ??? Error: The method registerObserver(Observer) in the type Subject is not applicable for the arguments (CurrentConditionsDisplay) 
    } 

    public void update(float temperature, float humidity, float pressure) { 
     this.temperature = temperature; 
     this.humidity = humidity; 
     display(); 
    } 

    public void display() { 
     System.out.println("Current conditions: " + temperature 
      + "F degrees and " + humidity + "% humidity"); 
    } 
} 

接口1

package be.intec.Meteo.Interfaces; 

import java.util.Observer; 
public interface Subject { 
    public void registerObserver(Observer o); 
    public void removeObserver(Observer o); 
    public void notifyObservers(); 
} 

接口2

package be.intec.Meteo.Interfaces; 

public interface Observer { 
    public void update(float temp, float humidity, float pressure); 
} 

接口3

package be.intec.Meteo.Interfaces; 

public interface DisplayElement { 
    public void display(); 
} 

Weatherdata類

package be.intec.Meteo.Codemeteo; 

import java.util.ArrayList; 

import be.intec.Meteo.Interfaces.Observer; 
import be.intec.Meteo.Interfaces.Subject; 

public class WeatherData implements Subject { 
    private ArrayList observers; 
    private float temperature; 
    private float humidity; 
    private float pressure; 

    public WeatherData() { 
     observers = new ArrayList(); 
    } 

    @Override 
    public void registerObserver(java.util.Observer o) { 
     observers.add(o); 

    } 

    @Override 
    public void removeObserver(java.util.Observer o) { 
     int i = observers.indexOf(o); 
     if (i >= 0) { 

      observers.remove(i); 
     } 

    } 

    @Override 
    public void notifyObservers() { 
     for (int i = 0; i < observers.size(); i++) { 
      Observer observer = (Observer) observers.get(i); 
      observer.update(temperature, humidity, pressure); 

     } 
    } 

    public void mesurementChanged() { 
     notifyObservers(); 
    } 

    public void setMeasurements(float temperature, float humidity, 
      float pressure) { 
     this.temperature = temperature; 
     this.humidity = humidity; 
     this.pressure = pressure; 

    } 

    // other weather data methos here 
} 

Tester類

package be.intec.Meteo.Codemeteo; 

import java.util.*; 

public class WeatherStation { 

    public static void main(String[] args) { 
     WeatherData weatherData = new WeatherData(); 

     CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(
       weatherData); 
     // StatisticsDisplay statisticsDisplay = new 
     // StatisticsDisplay(weatherData); 
     // ForecastDisplay forecastDisplay = new ForecastDisplay(weatherData); 

     weatherData.setMeasurements(80, 65, 30.4f); 
     weatherData.setMeasurements(82, 70, 29.2f); 
     weatherData.setMeasurements(78, 90, 29.2f); 
    } 
} 

回答

3

Subject接口導入錯誤Observer類。

您有:

import java.util.Observer; 
public interface Subject { 

您需要:

import be.intec.Meteo.Interfaces.Observer; 
public interface Subject { 
+0

這是一個非常糟糕的選擇來命名具有相同名稱從JDK一類一類,正是這種原因:你的IDE會傾向於自動導入JDK類,就像您的代碼的任何讀者的大腦一樣。選擇另一個名字! – Bohemian 2013-03-14 19:35:36

+0

謝謝。我的mystake。我想我現在應該休息一下。再次感謝你。 – 2013-03-14 19:38:01

+0

@Bohemian我不同意,有很多情況下框架使用更常見的名稱(例如File)。當發生衝突時,Eclipse和Netbeans都會要求開發人員選擇正確的類進行導入。 – 2013-03-14 19:40:54

-1

您正在試圖調用WeatherData.registerObserver(java.util.Observer)this作爲參數。但作爲be.intec.Meteo.Codemeteo.CurrentConditionsDisplay的一個實例,只實現了接口be.intec.Meteo.Interfaces.Observerbe.intec.Meteo.Interfaces.DisplayElement,導致編譯錯誤。

一對夫婦的意見:

  • Java包應全部小寫(使得它更容易,什麼是類區分,什麼是一個包)
  • 通常更容易,如果你的類名稱不與其他類共享名稱,以避免混淆,如本(be.intec.Meteo.Interfaces.Observer VS java.util.Observer
+0

-1,因爲我認爲第二個要點是可怕的建議。沒有類命名衝突,你幾乎不能使用任何框架。真正的問題是在選擇進口品時經驗不足/粗心。 – 2013-03-14 19:37:56

+0

我並不是說從不共享任何類名,但是我不會選擇與JRE類共享的類名,因爲它可能會導致混淆,並且在我看來會降低可維護性。特別是在代碼中也使用'java.util.Observer'類。 – beny23 2013-03-14 19:57:31