It can be argued that this template violates the Liskov Substituion Principle principle, since you cannot pass the "ElectricCar" wherever the "car" is expected if it declared abstract (you could, of course, pass instances of subclasses of ElectricCar).
In this particular example, the specific electric cars (hydrogen / plugins / etc.) that I would expect to inherit directly from "Car", since they satisfy the "is-a" relationship and are the proper specialization of "Car". If you want to describe some common behaviors and traits that they must provide, then they must also implement the ElectricCar interface.
It seems that you really want this ability to inherit from Car (as that is what they are) and share / repeat common implementations of electric vehicle-related methods. In this case, you are looking at the problem of multiple inheritance or the need for mixins , none of which are directly supported in Java.
Providing an abstract class in the middle of a specific hierarchy may be one way, but itβs not very.
Paolo source share