如何使用java中的流畅接口和泛型来修复对象返回类型

时间:2018-04-03 17:38:12

标签: java generics

我已经使用界面实现了流畅的方法。但我需要附加其他具体方法来保持原有的功能。

我扩展了原始界面并创建了其他界面。

但我无法将方法调用链接起来。 返回类型是Object,但方法很好实现。

我不知道将实例化哪种类型的对象。它在运行时确定。所以我不能转向具体的实现,例如

PlainTextProcessor<TabbedFile>

我如何解决这个问题?

所需功能:

// TabbedFile is determined at runtime. I only
// know that the instantiated type should implement
// the PlainTextProcessor interface.
PlainTextProcessor processor = new TabbedFile();

processor.method1(arg1).method(arg2).method3(arg3);

代码:

// Base interface
public interface DataProcessor<T>
{
    T method1(String classname);
    T method2(String classname);
}

// Concrete interface
public interface PlainTextProcessor<T> extends DataProcessor<T>
{
    T method3(String[] data);
}

// Concrete implementation
public class TabbedFile implements PlainTextProcessor<TabbedFile>
{
    @Override
    public TabbedFile method1(String classname)
    {
        ...
        return this;
    }

    @Override
    public TabbedFile method2(String classname)
    {
        ...
        return this;
    }

    @Override
    public TabbedFile method3(String[] data)
    {
        ...
        return this;
    }
}

// TargetClass
public class Processor
{
   private PlainTextProcessor processor;

   ...

   public void Dowork()
  {

    // Created via factory
    processor = ProcessorFactory.GetProcessor(param);

    processor
             .method(arg1)
             .method2(arg2)
             .method3(arg3);

  }

2 个答案:

答案 0 :(得分:3)

在Java中,从Java 1.5开始,您可以开箱即用covariant return types。 所以你的例子根本不需要通用。

// Base interface
public interface DataProcessor
{
    DataProcessor method1(String classname);
    DataProcessor method2(String classname);
}

// Concrete interface
public interface PlainTextProcessor extends DataProcessor
{
    PlainTextProcessor method1(String classname);
    PlainTextProcessor method2(String classname);
    PlainTextProcessor method3(String[] data);
}

// Concrete implementation
public class TabbedFile implements PlainTextProcessor
{
    @Override
    public TabbedFile method1(String classname)
    {
        ...
        return this;
    }

    @Override
    public TabbedFile method2(String classname)
    {
        ...
        return this;
    }

    @Override
    public TabbedFile method3(String[] data)
    {
        ...
        return this;
    }
}

答案 1 :(得分:0)

只需将方法调用链接到构造函数即可。

PlainTextProcessor processor = new TabbedFile()
                                  .method1(arg1)
                                  .method(arg2)
                                  .method3(arg3);

一旦你告诉编译器“这是一个PlainTextProcessor”,你只能使用该接口定义的方法。这包括这些方法的返回类型,对于接口而言,这些方法是泛型。