4

在下面的代码片段中,为什么第 1 行和第 2 行会很好,而第 3 行会导致编译错误?前两行在功能上不等同于第三行吗?

Loader loader = getLoaderManager().getLoader(0);
PatientLoader patientLoader = (PatientLoader) loader;
patientLoader = (PatientLoader) getLoaderManager().getLoader(0); // ERROR!

抛出这个:

java: somepath/Patient.java:99: inconvertible types
found   : android.content.Loader<java.lang.Object>
required: com.example.package.PatientLoader

PatientLoader间接延伸Loader<>

我来自 C# 背景,在 C# 中这不是问题,所以我可能遗漏了一些关于 Java 类型系统的内容。

PatientLoader延伸AsyncTaskLoader<Cursor>。任何熟悉 Android SDK 的人都会知道AsyncTaskLoader<>extends Loader<>

4

1 回答 1

8

它与括号的位置无关。这个问题与泛型有关:

例如编译失败:

Loader<Object> loader = getLoaderManager().getLoader(0);
PatientLoader ch = (PatientLoader)loader; // Will show compile error (Cannot cast from Loader<Object> to PatienLoader)

但这会编译得很好:

Loader<?> loader = getLoaderManager().getLoader(0);
PatientLoader ch = (PatientLoader)loader; // Compiles fine.

区别在于 <Object> 泛型与 <?> 泛型声明。

问题是 getLoader(int) 被定义为返回 Loader<D>。这意味着下面语句中的“getLoaderManager().getLoader()”被解释为 Loader<Object> 而不是 Loader<?>。

PatientLoader ch = (PatientLoader)getLoaderManager().getLoader(0); // Compile error.

我认为这是 SDK 中的一个“错误”。方法 getLoader(int) 应该被定义为返回 Loader<?> 而不是 Loader<D>。

于 2013-02-06T18:18:07.807 回答