code: @SuppressWarnings("unchecked")
      @Nullable
      public <T> T getProperty(final String key, final T defaultValue) {
          notNull("key", key);
  
          T value = (T) properties.get(key.toLowerCase());
          return (value == null && !properties.containsKey(key)) ? defaultValue : value;
      }
docs: Gets the property with the given key.
  
  @param key the key
  @param defaultValue the default value
  @param <T> the property value type
  @return the property value, or the default value if the property is not defined