【问题标题】:Add a "tag" to an IAnyResource将“标签”添加到 IanyResource
【发布时间】:2020-12-11 22:13:22
【问题描述】:

如何向 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 类型擦除问题?

【问题讨论】:

    标签: hapi-fhir hl7-fhir


    【解决方案1】:

    这似乎是 Java Type Erasure voodoo。

    见下文。

    如果你注释/取消注释不同BaseObjectHolder的三个版本,你可以看到问题。

    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
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-09
      • 2021-10-31
      • 2011-01-22
      • 2018-10-04
      • 1970-01-01
      • 2023-03-31
      相关资源
      最近更新 更多