参考对象通过其实现的通用接口

时间:2014-08-22 22:03:54

标签: java generics interface

我有一个看起来像这样的转换器界面:

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;它的基本具体类型?

2 个答案:

答案 0 :(得分:0)

这是FactoryMethod模式的完全反模式方法:

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方法应该返回相同类型的产品,即实现相同接口的产品。

例如:汽车厂可以退回不同类型的汽车但不能生产自行车。

enter image description here

enter image description here

如果您需要退回不同类型的产品,请使用抽象工厂

enter image description here