Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java泛型完全相同的类的不兼容类型_Java_Generics - Fatal编程技术网

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

Java泛型完全相同的类的不兼容类型,java,generics,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 stat

下面是我的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);
    }
}
都是完全相同的类型


我在这里遗漏了什么?

类我认为问题在于“必需”和“提供”中的问号可能不同。假设我有两个
Hello
的实现:
Hello1
Hello2
。我可以打电话:

some(newsomething(),Hello1.class);
这满足了
some
的约定,但您不希望能够调用
newsomething().someClass(Hello1.class)

我认为您需要通过使
some
generic来表达一次约束:

publicstaticvoidsome(某物mySomething,类myClass)

现在这两个参数是适当相关的,因此对
fun
的调用是有效的。

您需要将
some()
定义更改为:

public static <T extends Hello> void some(Something<T> mySomething, Class<T> myClass) {
    mySomething.fun(myClass);
}
publicstaticvoidsome(某物mySomething,类myClass){
mySomething.fun(myClass);
}
这是因为在
Something
类中,
T
类型在
fun
声明中的使用方式是
T
的实际类型必须完全相同


但是在你的
方法中,
?扩展Hello
可以是不同的类
Hello
可以有多个子类。

我看不到任何标有“Here!”(wink,wink)的行,并且您没有发布
main
方法。@Amongalen您并不真的需要main方法来显示编译时错误。
public static <T extends Hello> void some(Something<T> mySomething, Class<T> myClass) {
    mySomething.fun(myClass);
}