"extends"长链中的 Java 类型检查错误

标签 java typechecking

我对 Java 类型检查有点困惑:

我有一个静态方法声明为:

public static void register(EClass eClass, Class<? extends Page<EObject>> pClass) { ... }

我称之为:

Page.register(HyconmdePackage.Literals.STATION, StationPage.class);

其中第二个参数声明为(忘记第一个:没关系):

public class StationPage extends Page<Station> { ...
public abstract class Page<O> { ...
public interface Station extends Identifiable { ...
public interface Identifiable extends EObject { ...

但我收到错误:

The method register(EClass, Class<? extends Page<EObject>>) in the type Page is not applicable for the arguments (EClass, Class<StationPage>)

我也尝试将页面声明为:

public abstract class Page<O extends EObject> { ...

但错误仍然存​​在,并且我在 Page 类中遇到了更多问题。

我的错误是什么? (我希望这足以猜测问题;将程序缩小到有一个工作示例的大小将不是一个简单的任务)

钛合金

最佳答案

StationPage延伸Page<Station> ,但是您的方法签名要求它扩展 Page<EObject> .

请注意,即使 Station (间接)延伸EObject ,这并不意味着Page<Station>延伸Page<EObject> 。所以你不能使用Page<Station>Page<EObject>预计。

像这样声明方法:

public static void register(EClass eClass,
    Class<? extends Page<? extends EObject>> pClass)

您当然也可以使用类型参数而不是通配符:

public static <P extends Page<E>, E extends EObject> register(EClass eClass,
    Class<P> pClass)

关于 "extends"长链中的 Java 类型检查错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24585846/

相关文章:

haskell - fix 只能用非严格评估语言输入吗?

python - pycharm 类型检查器预期类型为 dict,而是得到 'None'

java - 如何使用 Dozer bean Mapper 转换 URL 字段?

java - 在java中屏蔽信用卡号

java - Android Websockets onMessage() 即使在连接时也不会被调用

flutter - 如何强制 Flutter/Dart 要求类型?

c++ - 类型检查中的纯名称等效

angular - 如何在模板中键入检查 Angular Directive 输入分配类型?

java - 使用 @Resource 注解注入(inject)的 DataSource 的生命周期/长度

java - 使用 OkHttp/Retrofit 处理 Cookie - 无法解析符号 'Preferences'