Может ли Java выводить универсальный тип из класса, определенного поверх универсальных?

Я позаимствовал код из этого другого ответа

interface IConverter<TFrom, TTo>
{
    TTo convert(TFrom from);
}

class IntToStringConverter implements IConverter<Integer, String>
{
    public String convert(Integer from)
    {
        return "This is a string: " + from.toString();
    }
}

class ConverterUser<TConverter extends IConverter<TFrom, TTo>, TFrom, TTo>
{
    public ConverterUser()
    {
    }

    private List<TConverter> _converter2;

    private TConverter _converter;

    public void replaceConverter(TConverter converter)
    {
        _converter = converter;
    }

    public TTo convert(TFrom from)
    {
        return _converter.convert(from);
    }
}

class Test
{
    public static void main(String[] args)
    {
        ConverterUser<IntToStringConverter, Integer, String> converterUser =
            new ConverterUser<IntToStringConverter, Integer, String>();

        converterUser.replaceConverter(new IntToStringConverter());

        System.out.println(converterUser.convert(328));
    }
}

Мой вопрос касается этого куска кода

    ConverterUser<IntToStringConverter, Integer, String> converterUser =
        new ConverterUser<IntToStringConverter, Integer, String>();

Как IntToStringConverter реализует IConverter<Integer, String>, Integer а также String тип известен, разве у java нет системы логических выводов, чтобы не печатать new ConverterUser<IntToStringConverter, Integer, String>() и просто введите new ConverterUser<IntToStringConverter>()?

1 ответ

Решение

Нет.

в ConverterUser определение класса, TFrom а также TTo Параметры типа должны быть где-то введены, чтобы они использовались в TConverter extends IConverter<TFrom, TTo> определение типа.

Вот почему ConverterUser результаты с тремя параметрами типа.

Обратите внимание, что вы все еще можете избавиться от параметров второго и третьего типа, но только если вы определите первый тип как подтип IntToStringConverter, Однако я бы не советовал вам делать это, потому что таким образом ConverterUser класс будет обречен на конвертацию только из Integer в String:

class ConverterUser<TConverter extends IntToStringConverter> {
    public ConverterUser() { ... }

    private TConverter _converter;

    public String convert(Integer from)
    {
        return _converter.convert(from);
    }
}
Другие вопросы по тегам