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

And*_*ung 4 java android

在下面的代码片段中,为什么第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<>.

Str*_*ton 8

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

例如编译失败:

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>.