Может ли 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);
}
}