@SuppressWarnings("unchecked")
    public T getValue() {
        final T value = (T) FROM_STRING.get(getConverterClass()).apply(JiveGlobals.getProperty(key), this);
        if (value == null || (Collection.class.isAssignableFrom(value.getClass()) && ((Collection) value).isEmpty())) {
            return defaultValue;
        }
        if (minValue != null && ((Comparable) minValue).compareTo(value) > 0) {
            LOGGER.warn("Configured value of {} is less than the minimum value of {} for the SystemProperty {} - will use default value of {} instead",
                value, minValue, key, defaultValue);
            return defaultValue;
        }
        if (maxValue != null && ((Comparable) maxValue).compareTo(value) < 0) {
            LOGGER.warn("Configured value of {} is more than the maximum value of {} for the SystemProperty {} - will use default value of {} instead",
                value, maxValue, key, defaultValue);
            return defaultValue;
        }
        return value;
    }
@Test
    public void willCreateAListOfCommaSeparatedString() {
        final String key = "a csv list property";

        final SystemProperty<List<String>> property = SystemProperty.Builder.ofType(List.class)
            .setKey(key)
            .setDefaultValue(Collections.emptyList())
            .setDynamic(true)
            .buildList(String.class);

        JiveGlobals.setProperty(key, "3,2,1");
        assertThat(property.getValue(), is(Arrays.asList("3", "2", "1")));
    }