Мне было интересно, как я могу вернуть конкретную реализацию, заданную переменной в качестве аргумента в функции. Это мой тестовый код
public interface Items {
String getName();
}
public class Car implements Items{
@Override
public String getName() {
return "Car";
}
public void drive(){
//To something
}
}
public class Shelf implements Items{
@Override
public String getName() {
return "Shelf";
}
public String getBooks(String bookName){
return bookName;
}
}
public enum Item {
CAR(Service::getCar),
TABLE(Service::getShelf),
;
Function<Service, ? extends Items> serviceFunction;
Item(Function<Service, ? extends Items> serviceFunction) {
this.serviceFunction = serviceFunction;
}
}
public class Service {
public Car getCar(){
return new Car();
}
public Shelf getShelf(){
return new Shelf();
}
public Items getItem(Item item){
return item.serviceFunction.apply(this);
}
public static void main(String[] args) {
Service service = new Service();
service.getItem(Item.CAR).getName();
// service.getItem(Item.CAR).drive(); // This is not valid.
}
}
Итак, то, что я хочу, основано на этом перечислении, я должен иметь возможность выполнять набор функций, связанных с этим перечислением, не передавая сам идентификатор реализации.
Я знаю, что я могу сделать это. И я буду работать, но я думал о получении конкретной реализации без прохождения Class<T> klass
.
public <T extends Items> T getItem(Item item, Class<T> klass){
return (T) item.serviceFunction.apply(this);
}
public static void main(String[] args) {
Service service = new Service();
service.getItem(Item.CAR, Car.class).drive();
}