2

我从另一个答案中借用了代码

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>和类型是已知的IntegerStringjava没有推理系统来避免打字new ConverterUser<IntToStringConverter, Integer, String>()和打字new ConverterUser<IntToStringConverter>()吗?

4

1 回答 1

2

不。

ConverterUser类定义中,必须在某处TFrom引入和类型参数,以便在类型定义中使用它们。TToTConverter extends IConverter<TFrom, TTo>

这就是为什么ConverterUser使用三个类型参数的结果。

请注意,您仍然可以摆脱第二个和第三个类型参数,但前提是您将第一个定义IntToStringConverter. 但是,我不建议您这样做,因为这样ConverterUser该类将注定只能从转换IntegerString

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

    private TConverter _converter;

    public String convert(Integer from)
    {
        return _converter.convert(from);
    }
}
于 2015-01-28T15:13:32.097 回答