簡體   English   中英

Java:Class 類型不匹配

[英]Java: Class Type mismatch

我的課程結構如下:

interface Z {}

interface Y extends Z {}

interface X extends Y {}


private static class A<T extends Z> {}

private static class B<T extends Y> extends A<T> {}

private static class C extends B<X> {}

為什么第一個有效而第二個無效?

private Class<? extends A<? extends Z>> clazz = C.class; // valid
private Class<? extends A<? extends Z>> clazzb = B.class; // error: Type mismatch: cannot convert from Class<TEST.B> to Class<? extends TEST.A<? extends TEST.Z>>

我想這是因為第二個例子中Y的類型不清楚,但你怎么能澄清它呢?

謝謝

Java Class 文字約束

簡單地說; 不,您不能綁定Class文字賦值,因為B<T>是泛型類型,即您可以擁有:

Class<? extends A<? extends Z>> clazzb = B<X>.class; // illegal statement
// OR
Class<? extends A<? extends Z>> clazzb = B<W>.class; // assuming W is a sub-type of X

因為只有一個 class 文字(就字節碼(運行時)和語言約束(編譯時)而言): B.class

由於編譯器無法知道B class 的類型參數T是哪種類型,因此它不允許這樣的賦值。

法律轉讓

下面的賦值語句是合法的(編譯得很好):

Class<? extends A> clazzb = B.class;

但帶有警告,這將完全符合通用 Class 和類型參數 Java 語言規范

我已經多次看到Java特定模式,其中開發人員使用通用實用程序方法來解決編譯器類型檢查,推斷其返回類型以匹配分配的引用類型:

<!-- language : lang-java -->

@SuppressWarnings("unchecked")
public static <T> Class<T> inferType(Class<?> clazz) {
    return (Class<T>) clazz;
}

然后你就可以執行過去被禁止的事情:

Class<? extends A<? extends Z>> clazzb = generify(B.class);

請注意,這應該只是不推薦的解決方法。 只是為了讓您更加確定,這里有一個非常令人困惑的語句,它編譯得很好:

Class<C> clazzb = generify(A.class);

乍一看,這應該行不通,但畢竟將class 文字分配給class 引用時,它會起作用。

暫無
暫無

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

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