Java 泛型不能对泛型 T 使用通配符

标签 java generics inheritance

我有以下小界面:

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/

相关文章:

java - JACOB 库的有效 COM 结构是什么?

java - Scala 中的多维数组

JavaFX - 切换到新场景时出现 NullPointerException

generics - Swift 枚举中通用关联值的确切限制是什么?

java - 泛型删除和遗留代码

C# 类型推断 : fails where it shouldn't?

c# - 编译后创建继承

c++ - 为什么派生类不能在数组中工作? (C++)

c# - 在基类中使用动态关键字和调用泛型方法导致 StackOverflowException

java - 在一个 Maven 项目中使用第 3 方 jar 的两个版本(存在代码冲突)