content: package com.airbnb.lottie;
  
  import java.util.Arrays;
  import java.util.Collections;
  import java.util.List;
  
  abstract class BaseAnimatableValue<V, O> implements AnimatableValue<O> {
    final List<Keyframe<V>> keyframes;
    final V initialValue;
  
    /**
     * Create a default static animatable path.
     */
    BaseAnimatableValue(V initialValue) {
      this(Collections.<Keyframe<V>>emptyList(), initialValue);
    }
  
    BaseAnimatableValue(List<Keyframe<V>> keyframes, V initialValue) {
      this.keyframes = keyframes;
      this.initialValue = initialValue;
    }
  
    /**
     * Convert the value type of the keyframe to the value type of the animation. Often, these
     * are the same type.
     */
    O convertType(V value) {
      //noinspection unchecked
      return (O) value;
    }
  
    public boolean hasAnimation() {
      return !keyframes.isEmpty();
    }
  
    public O getInitialValue() {
      return convertType(initialValue);
    }
  
    @Override public String toString() {
      final StringBuilder sb = new StringBuilder();
      sb.append("parseInitialValue=").append(initialValue);
      if (!keyframes.isEmpty()) {
        sb.append(", values=").append(Arrays.toString(keyframes.toArray()));
      }
      return sb.toString();
    }
  }
  