你为什么不能直接在java中输入类型?

时间:2013-02-06 17:52:37

标签: java android

在下面的代码段中,为什么第1行和第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>。任何熟悉w / Android SDK的人都会知道AsyncTaskLoader<>扩展Loader<>

1 个答案:

答案 0 :(得分:8)

它与括号的放置无关。 这个问题与Generics有关:

E.g。编译失败:

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.

区别在于&lt; Object&gt;泛型与&lt;?&gt;通用声明。

问题是getLoader(int)被定义为返回Loader&lt; D&gt;。这意味着下面的语句中的'getLoaderManager()。getLoader()'被解释为Loader&lt; Object&gt;而不是装载机&lt;?&gt;。

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

我认为这是SDK中的“错误”。应该定义方法getLoader(int)以返回Loader&lt;?&gt;而不是装载机&lt; D&gt;。