Почему вы не можете напрямую использовать тип в java?

В приведенном ниже фрагменте кода, почему строки 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<> extends Loader<> .

Это не имеет никакого отношения к размещению скобок. Эта проблема связана с Generics:

Например, сбой компиляции:

 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> generic по сравнению с <?> Общим объявлением.

Проблема в том, что getLoader (int) определен для возврата Loader <D>. Это означает, что getLoaderManager (). GetLoader () в приведенном ниже инструкциях интерпретируется как Loader <Object>, а не Loader <?>.

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

Я думаю, что это «ошибка» в SDK. Метод getLoader (int) должен был быть определен для возврата Loader <?>, А не Loader <D>.