【发布时间】:2019-01-12 00:32:09
【问题描述】:
考虑以下几点:
public interface Converter<I, O> {
public Class<I> getInputType();
public Class<O> getOutputType();
}
如果我实现接口并用非泛型类型填充类型参数,一切都很好:
public class ConverterImpl implements Converter<UUID, String> {
public Class<UUID> getInputType() {
return UUID.class;
}
public Class<String> getOutputType() {
return String.class;
}
}
但是,如果我实现接口并用泛型类型填充类型参数,问题就出现了:
public class ConverterImpl<T> implements Converter<Collection<T>, String> {
public Class<Collection<T>> getInputType() {
return Collection.class; //Compile time error
}
public Class<String> getOutputType() {
return String.class;
}
}
因为Collection.class 返回Class<Collection> 而不是Class<Collection<Something>>。但是,原始类型只是为了向后兼容而设计的,不建议使用。使用原始类型是这种情况的唯一解决方案吗?
【问题讨论】:
-
你不应该使用
Collection<T extends Something>吗? -
问题是
getInputType()和getOutputType()API 的真正用途是什么。如果不能代表I或O的完整类型(如果它们是不可实现的),那么调用者在运行时获取“类对象”是否有意义?
标签: java class generics collections raw-types