为什么可以';你不能直接在java中转换类型吗?

为什么可以';你不能直接在java中转换类型吗?,java,android,Java,Android,在下面的代码段中,为什么第1行和第2行可以,而第3行会导致编译错误?前两行在功能上不等同于第三行吗 Loader loader = getLoaderManager().getLoader(0); PatientLoader patientLoader = (PatientLoader) loader; patientLoader = (PatientLoader) getLoaderManager().getLoader(0); // ERROR! 抛出这个: java: somepath/

在下面的代码段中,为什么第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
java:somepath/Patient.java:99:inconvertable类型
找到:android.content.Loader
必需:com.example.package.PatientLoader
PatientLoader
间接扩展
Loader

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


PatientLoader
扩展了
AsyncTaskLoader
。任何熟悉安卓SDK的人都知道
AsyncTaskLoader
extends
Loader

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

例如,编译失败:

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

我认为这是SDK中的一个“bug”。方法getLoader(int)应该定义为返回加载器而不是加载器

这是Java类型擦除的产品吗?不,不是类型擦除。例如,类型擦除是指运行时无法看到ArrayList和ArrayList之间的区别。
Loader<?> loader = getLoaderManager().getLoader(0);
PatientLoader ch = (PatientLoader)loader; // Compiles fine.
PatientLoader ch = (PatientLoader)getLoaderManager().getLoader(0); // Compile error.