簡體   English   中英

Java泛型錯誤:來自命令行編譯器的不可逆類型

[英]Java Generics Error: inconvertible types from command line compiler

我有一些使用泛型的Guice綁定代碼,它可以從Eclipse的編譯器編譯和運行,但不能從Java(命令行)編譯器編譯。 我升級到最新的(1.7.0_01)Java SDK但仍然收到以下錯誤。

[error] ...\BindCategorySelectorActivity.java:42: error: inconvertible types
[error]                                 (Class<? extends ListAdapterDataProvider<Row<? extends DatabaseItem>>>) CategoryDataProvider.class);
[error]                                                                                                                             ^
[error]   required: Class<? extends ListAdapterDataProvider<Row<? extends DatabaseItem>>>
[error]   found:    Class<CategoryDataProvider>
[error] 1 error
[error] {file:/.../compile:compile: javac returned nonzero exit code

相關代碼:

public interface Category extends DatabaseItem {}
public class CategoryDataProvider implements 
 ListAdapterDataProvider<Row<Category>> {}
public class BindListViewHandlerWithSpecificProvider extends AbstractModule {
    public BindListViewHandlerWithSpecificProvider(
     Class<? extends ListAdapterDataProvider<Row<? extends DatabaseItem>>>
      dataProviderClass) {}
}

@SuppressWarnings("unchecked")
// Error happens here:
final BindListViewHandlerWithSpecificProvider 
 bindListViewHandlerWithSpecificProvider = 
  new BindListViewHandlerWithSpecificProvider(
   (Class<? extends ListAdapterDataProvider<Row<? extends DatabaseItem>>>)
    CategoryDataProvider.class);

幫自己一個忙,然后做一個向上傾斜,然后做一個垂頭喪氣:

Class<...> foo = (Class<...>)(Object)MyClass.class;

問題是CDP.class的類型為Class<CDP>CDP是原始類型。 雖然參數化類型C<T1,...,Tn>是原始類型C (§4.10.2)的子類型,但反之亦然: C不是C<T1,...,Tn>的子類型C<T1,...,Tn> 由於未經檢查的轉換(第5.1.9節),這似乎只是真實的。 這導致了你的問題:你希望CDP “擴展”(如在Class<? extends ...>的上限) LADP<Row<? extends DI>> LADP<Row<? extends DI>> 情況並非如此,因為類型參數包含(第4.5.1.1節)是在子類型上定義的,並不考慮未經檢查的轉換。

(或者切入追逐:javac有這個權利。)

我知道答案是有效的並且已被接受,但我相信這種沮喪的人不是完美的解決方案。 我的代碼清理也刪除了過時的下載...

1)eclipse和命令行沒有產生同樣問題的原因是因為eclipse設置。 轉到首選項 - java - 編譯器 - 錯誤/警告並將通用類型(未經檢查的泛型類型操作)設置為警告。 如果刪除@SuppressWarnings("unchecked")您將檢測到同樣的問題

2)我有一個類似的問題,一位朋友告訴我另一種解決方案。 要正確修復代碼(不使用向下轉換),只需將CategoryDataProvider.class更改為:

new CategoryDataProvider<Row<DatabaseItem>>().getClass()

然后放回@SuppressWarnings("unchecked")

暫無
暫無

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

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