这是我的 Java 代码的示例:
package com.company;
public class Main {
private static class Something<T>{
public void fun(Class<T> someClass){
someClass.cast(null);
}
}
private interface Hello{}
public static void some(Something<? extends Hello> mySomething, Class<? extends Hello> myClass){
mySomething.fun(myClass);
}
}
Run Code Online (Sandbox Code Playgroud)
我在该行收到一个奇怪的错误mySomething.fun(myClass):
package com.company;
public class Main {
private static class Something<T>{
public void fun(Class<T> someClass){
someClass.cast(null);
}
}
private interface Hello{}
public static void some(Something<? extends Hello> mySomething, Class<? extends Hello> myClass){
mySomething.fun(myClass);
}
}
Run Code Online (Sandbox Code Playgroud)
哪些是完全相同的类型...
我在这里缺少什么?
我认为问题在于“必需”和“提供”中的问号可能不同。假设我有Hello:Hello1和的两个实现Hello2。我可以打电话:
some(new Something<Hello2>(), Hello1.class);
Run Code Online (Sandbox Code Playgroud)
这履行了 的合同some,但您不希望能够打电话new Something<Hello2>().someClass(Hello1.class)。
我相信你需要通过通用来表达一次约束some:
public static <T extends Hello> void some(Something<T> mySomething, Class<T> myClass)
Run Code Online (Sandbox Code Playgroud)
现在这两个参数是适当相关的,因此调用fun是有效的。