java 可以从在泛型之上定义的 class 推断出泛型类型吗?

Can java infer the generic type from a class defined on top of generics?

我从另一个answer

那里借用了代码
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>IntegerString 类型是已知的,java 没有推理系统来避免键入 new ConverterUser<IntToStringConverter, Integer, String>() 然后只输入 new ConverterUser<IntToStringConverter>() ?

没有

ConverterUserclass定义中,TFromTTo类型参数必须在某处引入,所以它们在 TConverter extends IConverter<TFrom, TTo> 类型定义中使用。

这就是 ConverterUser 结果具有三个类型参数的原因。

请注意,您仍然可以去掉第二个和第三个类型参数,但前提是您将第一个参数定义为 完全 [=16] 的子类型=].但是,我不建议您这样做,因为这样 ConverterUser class 将 注定 只能从 Integer 转换为 String:

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

    private TConverter _converter;

    public String convert(Integer from)
    {
        return _converter.convert(from);
    }
}