Я пишу в Скале, и я имею дело с API Java, который возвращает List<? extends IResource>
, где IResource
является общим родительским интерфейсом (the details, if it helps).Java Wildcard Generic Тип Interop От Scala
Я пытаюсь добавить IResource
в список возвращенного этим методом, но я не могу получить мой код для компиляции (Patient
is a java class which implementsIResource
и getContainedResources возвращает List<? extends IResource>
):
Вот мой оригинал код
val patient = new Patient()
patient.setId(ID)
val patientASResource: IResource = patient
entry.getResource.getContained.getContainedResources.add(patient)
А вот ошибка я получаю:
type mismatch;
found : patientASResource.type (with underlying type ca.uhn.fhir.model.api.IResource)
required: ?0 where type ?0 <: ca.uhn.fhir.model.api.IResource
entry.getResource.getContained.getContainedResources.add(patientASResource)
^
one error found
Обратите внимание, что я пытаюсь добавить patientASResource
, который я набрал для интерфейса IResource
. Попытка добавить patient
(класс, реализующий интерфейс) имеет худшее сообщение об ошибке.
Другие вещи, которые я пробовал:
//From what I understand of "Java wildcards" per here: http://stackoverflow.com/a/21805492/2741287
type Col = java.util.Collection[_ <: IResource]
val resList: Col = entry.getResource.getContained.getContainedResources
val lst: Col = asJavaCollection(List(patient))
resList.addAll(lst)
не работает, либо, она возвращает что-то вроде:
type mismatch
found : java.util.Collection[_$1(in method transformUserBGs)] where type _$1(in method transformUserBGs) <: ca.uhn.fhir.model.api.IResource
required: java.util.Collection[_ <: _$1(in type Col)]
resList.addAll(lst)
^
Спасибо, что помогли мне понять мою проблему, которая заключалась в том, что я не понимал экзистенциальных типов/шаблонов java. – user2741287