gpt4 book ai didi

Java 泛型错误 : inconvertible types from command line compiler

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:20:58 25 4
gpt4 key购买 nike

我有一些使用泛型的 Guice 绑定(bind)代码,这些代码可以在 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> 的子类型.由于未经检查的转换(§5.1.9),这似乎只是真实的。这导致了您的问题:您期望 CDP “扩展”(如 Class<? extends ...> 的上限) LADP<Row<? extends DI>> .情况并非如此,因为类型参数包含(§4.5.1.1)是在子类型上定义的,并且不考虑未经检查的转换。

(或者切入正题:javac 做对了这一点。)

关于Java 泛型错误 : inconvertible types from command line compiler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8126682/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com