我有一个看起来像这样的转换器界面:
public interface MyTypeConverter<T>
{
public MyObject toMyObject(T obj);
public T fromMyObject(MyObject mo);
}
我也有该接口的实现:
public class ABCTypeConverter implements MyTypeConverter<ABCObject>
{
public MyObject toMyObject(ABCObject obj)
{
...do conversion...
}
public ABCObject fromMyObject(MyObject mo)
{
...do conversion...
}
}
一个评估对象类型的工厂,并返回一个适当的转换器实现:
public class MyTypeConverterFactory
{
public static MyTypeConverter<?> create(Object source)
{
if ( source instanceof ABCObject )
return new ABCTypeConverter();
...and so on...
}
}
现在我遇到的问题是使用界面引用Factory返回的转换器实例:
MyTypeConverter<?> converter = MyTypeConverterFactory.create(someObject);
MyObject mo = converter.toMyObject(someObject);
最后一行给出了以下编译时错误:
The method toMyObject(capture#3-of ?) in the type MyTypeConverter<capture#3-of ?>
is not applicable for the arguments (ABCObject)
那么我怎么能以通用的方式引用转换器?
修改
我的问题的核心是:如何在不首先转换为底层具体类型的情况下在接口引用上调用方法?如果我不能,那么创建通用接口的重点是什么? I.E.,我该怎么做(无论我如何获得参考):
MyTypeConverter<?> converter = MyTypeConverterFactory.create(someObject);
MyObject mo = converter.toMyObject(someObject);
没有第一次铸造&#34;转换器&#34;它的基本具体类型?
答案 0 :(得分:0)
if ( source instanceof ABCObject )
return new ABCTypeConverter();
...and so on...
不要这样做,它永远不会扩展,永远不可维护。
有什么问题:
TypeConverter<ABCObject> tc = new TypeConverter<ABCObject>();
这就是每个实现此类功能的理智框架的工作原理。
例如:
com.google.common.base.Converter
看看Jackson如何为JSON Serializer / Deserializers做这件事。
有一种方法可以让Guava获取类型T
Class<T> klass = (Class<T>) new TypeToken<T>(getClass()) {}.getRawType();
然后你可以做klass.newInstance();
,但这很好看。
答案 1 :(得分:0)
您也可以尝试多态,而不是 Generic 。
只需从工厂的create()
方法返回接口引用而不是实际对象引用。在运行时,实际对象根据重写方法逻辑决定应该调用哪种方法。
在下面的示例代码中,我创建了一个接口MyTypeConverterObject
,它由属于MyTypeConverter
接口的所有类实现。
现在只需从工厂的MyTypeConverterObject
方法返回create()
。
示例代码:
interface MyTypeConverterObject {}
class ABCObject implements MyTypeConverterObject {}
class XYZObject implements MyTypeConverterObject {}
class MyObject {}
interface MyTypeConverter {
public MyObject toMyObject(MyTypeConverterObject obj);
public MyTypeConverterObject fromMyObject(MyObject mo);
}
class ABCTypeConverter implements MyTypeConverter {
public MyObject toMyObject(MyTypeConverterObject obj) {
return new MyObject();
}
public MyTypeConverterObject fromMyObject(MyObject mo) {
return new ABCObject();
}
}
class MyTypeConverterFactory {
public static MyTypeConverter create(Object source) {
if (source instanceof ABCObject) {
return new ABCTypeConverter();
}
return ...;
}
}
Factory方法应该返回相同类型的产品,即实现相同接口的产品。
例如:汽车厂可以退回不同类型的汽车但不能生产自行车。
如果您需要退回不同类型的产品,请使用抽象工厂。