Я не совсем уверен, чего вы здесь добиваетесь, поэтому я сначала перечислю несколько исправленных классов с моими лучшими догадками ...
public interface VehicleEntity {
public String getId();
public String getSpeed();
public void move();
}
public interface CarEntity extends VehicleEntity {
public void addToCar(String key, CarEntity c);
}
import java.util.HashMap;
public class Car implements CarEntity{
HashMap<String, VehicleEntity> cars = new HashMap<String, VehicleEntity>();
@Override
public void addToCar(String key, CarEntity car) {
cars.put(key, this);
}
@Override
public String getId() {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public String getSpeed() {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void move() {
throw new UnsupportedOperationException("Not supported yet.");
}
}
... а затем покажу вам классный трюк с использованием дженериков:
import java.util.HashMap;
public class VehicleManager {
HashMap<String, VehicleEntity> vehicles =
new HashMap<String, VehicleEntity>();
public <T extends VehicleEntity> T report(String id) {
for(VehicleEntity ve : vehicles.values()) {
if(ve.getId().equals(id)) {
@SuppressWarnings("unchecked")
T ce = (T)ve;
return ce;
}
}
return null;
}
public void test() {
final Car c = report("test");
}
}
Я параметризовал метод report
с расширением T
VehicleEntity
. Он вернет что-то такого типа T
. При использовании этого в методе test()
мы заявили, что нам нужен Car
. Теперь будет происходить вывод некоторых типов, автоматически вызывающий метод report
для типа Car
. Если VehicleEntity
на карте с указанным идентификатором не является Car
, мы получим ClassCastException, поскольку мы пытаемся привести к Car
при вызове метода thet в этом контексте.