[英]Java Generics incompatible types for the exact same class
這是我的 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);
}
}
我在mySomething.fun(myClass)
行遇到了一個奇怪的錯誤:
Required type: Class<? extends com.company.Main.Hello>
Provided: Class<? extends com.company.Main.Hello>
哪些是完全相同的類型...
我在這里想念什么?
我認為問題在於“必需”和“提供”中的問號可能不同。 假設我有Hello
的兩個實現: Hello1
和Hello2
。 我可以打電話:
some(new Something<Hello2>(), Hello1.class);
這滿足了some
的合同,但您不希望能夠調用new Something<Hello2>().someClass(Hello1.class)
。
我相信你需要通過做some
通用來表達約束:
public static <T extends Hello> void some(Something<T> mySomething, Class<T> myClass)
現在這兩個參數是適當相關的,所以對fun
的調用是有效的。
Class<? extends com.company.Main.Hello>
Class<? extends com.company.Main.Hello>
是一個Class
,其類型參數是Hello
或擴展Hello
的一些 class 。
因此兩個不相關Class<? extends com.company.Main.Hello>
Class<? extends com.company.Main.Hello>
可能代表Hello
的兩個不同子類。
例如,假設您向您的some(Something<? extends Hello> mySomething, Class<? extends Hello> myClass)
方法傳遞了Something<Hello1>
和Class<Hello2>
。 Hello1
和Hello2
都是Hello
的子類,但您不能將Class<Hello2>
參數傳遞給Something<Hello1>
的fun()
方法(這需要Class<Hello1>
)。
<? extends MyClass>
<? extends MyClass>
(在第一個參數中)不保證與<? extends MyClass>
<? extends MyClass>
(在第二個參數中)。
如果類型相同,例如:
public static <T> void some(Something<T> mySomething, Class<T> myClass) {
mySomething.fun(myClass);
}
然后編譯通過就好了。
您需要將some()
定義更改為:
public static <T extends Hello> void some(Something<T> mySomething, Class<T> myClass) {
mySomething.fun(myClass);
}
這是因為在您的Something
class 中,類型T
在fun
聲明中使用的方式是T
的實際類型必須完全相同。
但是在你的some
方法中, ? extends Hello
? extends Hello
可以是不同的類。 Hello
可以有多個子類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.