簡體   English   中英

Java Generics 不兼容類型為完全相同的 class

[英]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的兩個實現: Hello1Hello2 我可以打電話:

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> Hello1Hello2都是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 中,類型Tfun聲明中使用的方式是T的實際類型必須完全相同。

但是在你的some方法中, ? extends Hello ? extends Hello可以是不同的類。 Hello可以有多個子類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM