在下面的代码片段中,为什么第1行和第2行会正常,而第3行会导致编译错误?前两行在功能上是否与第三行相当?
Loader loader = getLoaderManager().getLoader(0);
PatientLoader patientLoader = (PatientLoader) loader;
patientLoader = (PatientLoader) getLoaderManager().getLoader(0); // ERROR!
Run Code Online (Sandbox Code Playgroud)
抛出这个:
java: somepath/Patient.java:99: inconvertible types
found : android.content.Loader<java.lang.Object>
required: com.example.package.PatientLoader
Run Code Online (Sandbox Code Playgroud)
PatientLoader间接延伸Loader<>.
我来自C#背景和C#,这不会有问题,所以也许我对Java类型系统缺少一些东西.
PatientLoader延伸AsyncTaskLoader<Cursor>.任何熟悉w/Android SDK的人都会知道AsyncTaskLoader<>扩展Loader<>.
它与括号的放置无关.这个问题与泛型有关:
例如编译失败:
Loader<Object> loader = getLoaderManager().getLoader(0);
PatientLoader ch = (PatientLoader)loader; // Will show compile error (Cannot cast from Loader<Object> to PatienLoader)
Run Code Online (Sandbox Code Playgroud)
但这将编译好:
Loader<?> loader = getLoaderManager().getLoader(0);
PatientLoader ch = (PatientLoader)loader; // Compiles fine.
Run Code Online (Sandbox Code Playgroud)
区别在于<Object>泛型与<?>泛型声明.
问题是getLoader(int)被定义为返回Loader <D>.这意味着下面语句中的'getLoaderManager().getLoader()'被解释为Loader <Object>而不是Loader <?>.
PatientLoader ch = (PatientLoader)getLoaderManager().getLoader(0); // Compile error.
Run Code Online (Sandbox Code Playgroud)
我认为这是SDK中的"错误".应该定义方法getLoader(int)以返回Loader <?>而不是Loader <D>.