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>
,Integer
和 String
类型是已知的,java 没有推理系统来避免键入 new ConverterUser<IntToStringConverter, Integer, String>()
然后只输入 new ConverterUser<IntToStringConverter>()
?
没有
在ConverterUser
class定义中,TFrom
和TTo
类型参数必须在某处引入,所以它们在 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);
}
}
我从另一个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>
,Integer
和 String
类型是已知的,java 没有推理系统来避免键入 new ConverterUser<IntToStringConverter, Integer, String>()
然后只输入 new ConverterUser<IntToStringConverter>()
?
没有
在ConverterUser
class定义中,TFrom
和TTo
类型参数必须在某处引入,所以它们在 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);
}
}