我对 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/