How many instances of "t" are there in:
Q: Реализация EventHandler Изучая книгу познакомился с обработчиком событий EventHandler, но мне не понравился предложенный в книге способ его привязывания к объектам в виде:
btn.setOnAction(new EventHandler<ActionEvent>() {
  public void handle(ActionEvent event) {. . .} });

Работая со swing мне кажется удобнее создавать внутренний класс в виде наследника ActionListener с переопределением метода внутри него и предоставлением его когда нужно.
Попытался провернуть это же с EventHandler, но запутался с дженериками(скорее всего) и не совсем понимаю в чем проблема созданного мной наследника. Один из вариантов кода который пытался сделать:
  private class btnHandler<E extends Event> implements EventHandler<E extends Event> {
    @Override
    public void handle(E eventObj) {
      System.out.println("Haha");  
    }
  }

Основная проблема в ошибке говорящей что я не переопределил метод интерфейса, хотя видно что handle переопределен.
Получилось чтобы запустился такой образец:
  private class btnHandler<T> implements EventHandler<ActionEvent> {
    @Override
    public void handle(ActionEvent eventObj) {
      System.out.println("Haha"); 
    }
  }

Но я не совсем понимаю в чем причина неработоспособности первого образца и тем более хочу понять как сделать наследника способного принимать сразу несколько типов ивентов, а не только ActionEvent, например.
Еще нашел вариант создавать EventHandler привязанный к ссылке и так же предоставлять его куда надо, но все же вопросы возникшие выше оставлять без внимания кажется грубой ошибкой.
Весь код класса:
import javafx.application.Application;
import javafx.stage.*;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.event.*;
import javafx.scene.paint.*;


public class JavaFXApplication extends Application {

  public static void main(String[] args) {

    launch();
  }

  @Override
  public void start(Stage mainStage) {

    mainStage.setTitle("Тест GUI-компонентов");   
    Group root = new Group();
    Scene  scene = new Scene (root,400,300,Color.LIGHTGREEN);
   
    Button btn = new Button("Тестировать свойства");
    btn.setLayoutX(20);
    btn.setLayoutY(20);
    btn.setOnAction(new btnHandler<ActionEvent>());
    
    mainStage.setScene(scene);
    mainStage.show();
  }


  private class btnHandler<T> implements EventHandler<T extends Event> {
    @Override
    public void handle(T eventObj) {

      System.out.println("Haha");
     
    }
  }
}
      


A: У вас проблема с дженериками(это довольно сложный для понимания , но одновременно очень мощный механизм, посему уделите ему внимание), именно из-за некорректно написанных дженериков ваш код не компилируется. Код исправил. Альтернативный (более простой) вариант, основанный на лямбдах, также добавил и закомментировал. С последним очень рекомендую разобраться, поскольку джава 8 появилась довольно давно, посему в настоящее время функционального кода написано достаточно много, что делает его понимание ультимативным для любого джава-разработчика. Удачи
import javafx.application.Application;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class JavaFXApplication extends Application {

    public static void main(String[] args) {
        launch();
    }

    @Override
    public void start(Stage mainStage) {

        mainStage.setTitle("Тест GUI-компонентов");
        Group root = new Group();
        Scene scene = new Scene(root, 400, 300, Color.LIGHTGREEN);

        Button btn = new Button("Тестировать свойства");
        btn.setLayoutX(20);
        btn.setLayoutY(20);
        
        //btn.setOnAction(e -> System.out.println("Haha"));          
        btn.setOnAction(new BtnHandler<>());

        mainStage.setScene(scene);
        mainStage.show();
    }

    private class BtnHandler<T extends Event> implements EventHandler<T> {

        @Override
        public void handle(T eventObj) {
            System.out.println("Haha");

        }
    }

}


user
The total number of "t"s in that passage is 178.
assistant