### Question:
AdditionalData implements Jsonable { @Nullable public Object getValue(String key, Object... defaultValue) { JsonOption option = data.get(key); if (option != null) { try { return Class.forName(option.getType()).cast(option.getValue()); } catch (ClassNotFoundException e) { } } if (defaultValue.length > 0) { return defaultValue[0]; } return null; } AdditionalData();  AdditionalData(Map<String, JsonOption> data);  AdditionalData(AdditionalData copyFrom); boolean isEmpty(); void addData(String key, T... values); void addDataWithType(String key, T value, Class<?> type); void addData(AdditionalData additionalData, boolean allowOverwrite); void removeData(String key); @Nullable Object getAndRemoveData(String key); @Nullable T getAndRemoveData(String key, Class<T> desiredType); void clearData(); boolean hasData(String key); @NonNull Set<String> getKeys(); @Nullable String getValueClassName(String key); @Nullable Object getValue(String key, Object... defaultValue); @NonNull Map<String, T> getDataOfType(Class<T> desiredType); @Nullable T getValue(String key, Class<T> desiredType, T... defaultValue); String getStringValue(String key, String... defaultValue); int getIntegerValue(String key, Integer... defaultValue); boolean getBooleanValue(String key, Boolean... defaultValue); @Override boolean equals(Object o); @Override int hashCode(); @Override String toString(); @Override String toJson(); static AdditionalData fromJson(String json);  }### Answer:
@Test public void canGetDefaultValue() throws Exception { assertThat(additionalData.getValue("hello")).isNull(); assertThat(additionalData.getValue("hello", "default")).isEqualTo("default"); assertThat(additionalData.getValue("hello", String.class)).isNull(); assertThat(additionalData.getValue("hello", String.class, "default")).isEqualTo("default"); }