Java泛型错误:来自命令行编译器的不可逆类型

Jef*_*rod 9 java eclipse generics guice

我有一些使用泛型的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
Run Code Online (Sandbox Code Playgroud)

相关代码:

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);
Run Code Online (Sandbox Code Playgroud)

Ben*_*ulz 6

帮自己一个忙,然后做一个向上倾斜,然后做一个垂头丧气:

Class<...> foo = (Class<...>)(Object)MyClass.class;
Run Code Online (Sandbox Code Playgroud)

问题是CDP.class类型Class<CDP>,CDP是原始类型.虽然参数化类型C<T1,...,Tn>是原始类型的子类型C(§4.10.2),但逆不是真的:C不是子类型C<T1,...,Tn>.由于未经检查的转换(第5.1.9节),这似乎只是真实的.这导致了您的问题:您希望CDP"扩展"(如上限Class<? extends ...>)LADP<Row<? extends DI>>.情况并非如此,因为类型参数包含(第4.5.1.1节)是在子类型上定义的,并不考虑未经检查的转换.

(或者切入追逐:javac有这个权利.)