2016-09-08 2 views
1

Я пишу в Скале, и я имею дело с API Java, который возвращает List<? extends IResource>, где IResource является общим родительским интерфейсом (the details, if it helps).Java Wildcard Generic Тип Interop От Scala

Я пытаюсь добавить IResource в список возвращенного этим методом, но я не могу получить мой код для компиляции (Patientis 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) 
^ 

ответ

1

Проблема не с Interop. Это определенно не должно компилироваться, и не должно быть эквивалентного кода Java.

List<? extends IResource> означает, что он может быть List<IResource>, List<Patient>, List<SomeSubclassOfPatient>, List<SomeOtherResourceUnrelatedToPatient> и т.д., и вы не знаете, какой. Таким образом, добавление Patient (или IResource после восходящего потока) в такой список не допускается.

Если вы каким-то образом знает, что в вашей конкретной ситуации entry такова, что entry.getResource.getContained.getContainedResources возвращает List[IResource], или List[Patient], вы должны попытаться обеспечить это статически, указав это при переопределении getContainedResources. Если это невозможно, то последним средством является приведение:

entry.getResource.getContained. 
    getContainedResources.asInstanceOf[java.util.List[IResource]].add(patient) 

Просто повторить: вы должны избежать этого, если вообще возможно.

+0

Спасибо, что помогли мне понять мою проблему, которая заключалась в том, что я не понимал экзистенциальных типов/шаблонов java. – user2741287

Смежные вопросы