我有以下小界面:
public interface EntityController<T> {
public void update( float elapsed, T applyTo );
}
我想按以下方式使用:
private Map<Class<? extends GameObject>, EntityController<?>> registeredControllers;
public EntityController<?> getController(GameObject o) {
return registeredControllers.get(o.getClass());;
}
...
getController(myObj).update(elapsed, myObj);
最后一行给我的错误是 The method update(float, capture#1-of ?) in the type EntityController<capture#1-of ?> is not applicable for the arguments (float, GameObject)
这是为什么呢?基本上,我想要实现的是:
我知道每个 EntityController
只负责处理一种特定类型的类。因此,在它的更新方法中,我将始终必须转换我的 GameObject
到各自的类型,这很烦人,我想也会产生某种开销?我认为泛型是解决问题的好方法,它允许我以下列方式创建特定的 Controller :
public class MyController implements EntityController<MyType> {
public void update(float elapsed, MyType applyTo){}
}
为什么这不可能?
最佳答案
简单来说,不能给通配符类型赋值,因为实际类型是未知的。所以如果返回类型是EntityController<?>
,您不能分配给更新的第二个参数。
最简单(但不是 100% 类型安全)的解决方案是
private Map<Class<? extends GameObject>, EntityController<? extends GameObject>> registeredControllers;
@SuppressWarnings("unchecked")
public <T extends GameObject> EntityController<T> getController(T o) {
return (EntityController<T>) registeredControllers.get(o.getClass());
}
关于Java 泛型不能对泛型 T 使用通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47450446/