2016-07-13 20 views
0

Ich habe diesen Code bekam:Wie kann ich jetzt den generischen umschlossenen Wert auf einem Property Change Listener auf Java Fx?

circle2.radiusProperty().addListener(new ChangeListener<Number>() { 
     @Override 
     public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) { 
      System.out.println("Change detected for " + observable); 
      circle1.setRadius(newValue.doubleValue()); 
     } 
    }); 

final IntegerProperty lapCounterProperty = new SimpleIntegerProperty(); 
    pathTransition.currentTimeProperty().addListener(new ChangeListener<Duration>() { 

     @Override 
     public void changed(ObservableValue<? extends Duration> observable, Duration oldValue, Duration newValue) { 

     } 
    }); 

Wie kann ich wissen, was der Typ-Parameter für ChangeListener<> sein sollte?

Antwort

2

Die addListener Methode stammt aus ObservableValue<T>, die

void addListener(ChangeListener<? super T> listener) 

definiert, während ChangeListener<S> definiert:

void changed(ObservableValue<? extends S> observable, S oldValue, S newValue) 

es einfach zu halten (in der Regel gibt es keinen Grund, nicht zu), wenn Sie einen ObjectProperty<Duration> (was ist PathTransition#duration) ist, würden Sie eine ChangeListener<Duration> verwenden möchten, die changed Methode mit der Signatur haben wird:

void changed(ObservableValue<? extends Duration> observable, Duration oldValue, Duration newValue) 

Aber Sie auch ChangeListener<T> für jeden T, die einen Supertyp ist von Duration (Object, zum Beispiel), während die changed Methode des Hörers für jeden T ein ObservableValue<T> akzeptieren kann, die Dauer erstreckt sich nutzen könnten.

Also die kurze Antwort ist - wenn Sie keinen guten Grund haben, nicht, verwenden Sie immer den gleichen Typ Parameter Ihrer ObservableValue für es ist ChangeListener.

+0

Ich bin mir nicht sicher, ob ich verstehe, was Sie sagen/fragen. Die Signatur von 'addListener' fordert' ChangeListener '(Read - ein Change Listener von etwas, das ein Super-Typ von T ist), also wenn' T' 'Duration' ist, kann ich einen' ChangeListener 'oder' verwenden ChangeListener ', as' Objekt ist ein Super-Typ von 'Duration' (das heißt -' Duration' verlängert 'Object'). – Itai

+0

Nun, das ist völlig korrekt. Ich dachte, du meinst den umgekehrten Weg einer verlängerten Duration-Klasse. Vielleicht ist mein Englisch nicht gut genug oder es ist ein bisschen mehrdeutig für mich. – NwDev

+1

Ich habe die Antwort bearbeitet und änderte es in "für jede T, die ein Supertyp der Dauer ist", ich hoffe, das ist klarer. – Itai