[英]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.