#hapi-fhir #hl7-fhir
#hapi-fhir #hl7-fhir
Вопрос:
Как мне добавить «тег» в IAnyResource?
import org.hl7.fhir.instance.model.api.IAnyResource;
import org.hl7.fhir.instance.model.api.IBaseCoding;
import org.hl7.fhir.r4.model.Coding;
import java.util.ArrayList;
import java.util.List;
public IAnyResource tagAnIAnyResource(IAnyResource anyRes) {
IAnyResource returnItem = null;
if (null != anyRes) {
returnItem = anyRes;
List<? extends IBaseCoding> temp = anyRes.getMeta().getTag();
String tempReport = temp.getClass().getSimpleName();
List<IBaseCoding> tagList = new ArrayList<>();
IBaseCoding dogA = new Coding().setSystem(null).setCode("Dog").setDisplay("Puppies");
/* below does not work :< */
anyRes.getMeta().getTag().add(dogA);
tagList.add(dogA);
// Add this twice
tagList.add(new Coding().setSystem("http://foo").setCode("Cat").setDisplay("Kittens"));
tagList.add(new Coding().setSystem("http://foo").setCode("Cat").setDisplay("Kittens"));
/* below does not work :< */
anyRes.getMeta().getTag().addAll(tagList);
/* out of desperation */
List<? extends IBaseCoding> castList = (List<? extends IBaseCoding>) tagList;
/* below does not work :< */
anyRes.getMeta().getTag().addAll(castList);
}
return returnItem;
}
Текущая ошибка:
Error:(35, 43) java: incompatible types: org.hl7.fhir.instance.model.api.IBaseCoding cannot be converted to capture#1 of ? extends org.hl7.fhir.instance.model.api.IBaseCoding
Error:(46, 46) java: incompatible types: java.util.List<org.hl7.fhir.instance.model.api.IBaseCoding> cannot be converted to java.util.Collection<? extends capture#2 of ? extends org.hl7.fhir.instance.model.api.IBaseCoding>
Error:(51, 46) java: incompatible types: java.util.List<capture#3 of ? extends org.hl7.fhir.instance.model.api.IBaseCoding> cannot be converted to java.util.Collection<? extends capture#4 of ? extends org.hl7.fhir.instance.model.api.IBaseCoding>
Образец кода (закодированный для пациента r4) в основном из
Я просто попытался сделать его более пригодным для повторного использования с
/**
* An IBaseResource that has a FHIR version of DSTU3 or higher
*/
public interface IAnyResource extends IBaseResource {
Или это какая-то проблема с удалением типа Java?
Ответ №1:
Кажется, это Java-тип Erasure voodoo.
Смотрите ниже.
Если вы прокомментируете / раскомментируете три версии differentBaseObjectHolder, вы увидите проблему.
Дженерики Java ужасны.
/*
*
* import org.hl7.fhir.instance.model.api.IAnyResource;
* import org.hl7.fhir.instance.model.api.IBaseCoding;
* import org.hl7.fhir.r4.model.Coding;
* import org.hl7.fhir.r4.model.DomainResource;
* import org.hl7.fhir.r4.model.Identifier;
* import org.hl7.fhir.r4.model.Patient;
*
* */
org.hl7.fhir.r4.model.Patient patOne = new org.hl7.fhir.r4.model.Patient();
List<Identifier> identifierList = new ArrayList<>();
Identifier identifier = new Identifier();
identifier.setSystem("MySystem1");
identifier.setValue("MyValue1");
identifierList.add(identifier);
patOne.setIdentifier(identifierList);
//below works fine
org.hl7.fhir.r4.model.Patient differentBaseObjectHolder = patOne;
//below works fine
//org.hl7.fhir.r4.model.DomainResource differentBaseObjectHolder = (DomainResource) patOne;
//Java Type Erasure Generics kick in. Does not work. Java Generics are horrible
//org.hl7.fhir.instance.model.api.IAnyResource differentBaseObjectHolder = patOne;
List<? extends IBaseCoding> temp = differentBaseObjectHolder.getMeta().getTag();
String tempReport = temp.getClass().getSimpleName();
List<Coding> tagList = new ArrayList<>();
Coding dogA = new Coding().setSystem(null).setCode("Dog").setDisplay("Puppies");
differentBaseObjectHolder.getMeta().getTag().add(dogA);
tagList.add(dogA);
// Add this twice
tagList.add(new Coding().setSystem("http://foo").setCode("Cat").setDisplay("Kittens"));
tagList.add(new Coding().setSystem("http://foo").setCode("Cat").setDisplay("Kittens"));
differentBaseObjectHolder.getMeta().getTag().addAll(tagList);
List<? extends Coding> castList = (List<? extends Coding>) tagList;
/* below does not work :< */
differentBaseObjectHolder.getMeta().getTag().addAll(castList);
=====
hapiFhirVersion = '5.2.0'
зависимости {
implementation group: 'ca.uhn.hapi.fhir', name: 'hapi-fhir-structures-r4', version: hapiFhirVersion
}