protected JavaType findSerializationType(Annotated a,boolean useStaticTyping,JavaType declaredType){
  Class<?> serClass=_annotationIntrospector.findSerializationType(a);
  if (serClass != null) {
    Class<?> rawDeclared=declaredType.getRawClass();
    if (serClass.isAssignableFrom(rawDeclared)) {
      declaredType=declaredType.widenBy(serClass);
    }
 else {
      if (!rawDeclared.isAssignableFrom(serClass)) {
        throw new IllegalArgumentException("Illegal concrete-type annotation for method '" + a.getName() + "': class "+ serClass.getName()+ " not a super-type of (declared) class "+ rawDeclared.getName());
      }
      declaredType=_config.constructSpecializedType(declaredType,serClass);
    }
    useStaticTyping=true;
  }
  JavaType secondary=BeanSerializerFactory.modifySecondaryTypesByAnnotation(_config,a,declaredType);
  if (secondary != declaredType) {
    useStaticTyping=true;
    declaredType=secondary;
  }
  if (!useStaticTyping) {
    JsonSerialize.Typing typing=_annotationIntrospector.findSerializationTyping(a);
    if (typing != null) {
      useStaticTyping=(typing == JsonSerialize.Typing.STATIC);
    }
  }
  return useStaticTyping ? declaredType : null;
}

protected JavaType findSerializationType ( Annotated a , boolean useStaticTyping , JavaType declaredType ) { Class < ? > serClass = _annotationIntrospector . findSerializationType ( a ) ; if ( serClass != null ) { Class < ? > rawDeclared = declaredType . getRawClass ( ) ; if ( serClass . isAssignableFrom ( rawDeclared ) ) { declaredType = declaredType . widenBy ( serClass ) ; } else { if ( ! rawDeclared . isAssignableFrom ( serClass ) ) { throw new IllegalArgumentException ( "Illegal concrete-type annotation for method '" + a . getName ( ) + "': class " + serClass . getName ( ) + " not a super-type of (declared) class " + rawDeclared . getName ( ) ) ; } declaredType = _config . constructSpecializedType ( declaredType , serClass ) ; } useStaticTyping = true ; } JavaType secondary = BeanSerializerFactory . modifySecondaryTypesByAnnotation ( _config , a , declaredType ) ; if ( secondary != declaredType ) { useStaticTyping = true ; declaredType = secondary ; } if ( ! useStaticTyping ) { JsonSerialize . Typing typing = _annotationIntrospector . findSerializationTyping ( a ) ; if ( typing != null ) { useStaticTyping = ( typing == JsonSerialize . Typing . STATIC ) ; } } return useStaticTyping ? declaredType : null ; }
method that will try to determine statically defined type of property being serialized , based on annotations ( for overrides ) , and alternatively declared type ( if static typing for serialization is enabled ) . if neither can be used ( no annotations , dynamic typing ) , returns null .
