完全相同的类的 Java 泛型不兼容类型

Mat*_*ger 4 java generics

这是我的 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)

哪些是完全相同的类型...

我在这里缺少什么?

Jon*_*eet 5

我认为问题在于“必需”和“提供”中的问号可能不同。假设我有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是有效的。