Добавить «тег» в IAnyResource

#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) в основном из

https://github.com/jamesagnew/hapi-fhir/blob/master/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r4/FhirResourceDaoR4Test.java#L3652L3657

Я просто попытался сделать его более пригодным для повторного использования с

 /**
 * 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
 

}