在泛型类中实现泛型接口

时间:2017-07-15 09:00:42

标签: java generics interface

我是泛型类型的新手,并且想知道如何在泛型类中正确实现泛型接口,因此类型的确定将延迟到我实例化此对象的时刻泛类。

我的代码如下:

package org.processor.interfaces;

import org.filter.interfaces.IFile;

public interface ProcessorResult<T> {

 public IFile getFile();
 public String getProcessorName();
 public Class<? extends Processor<T>> getProcessorClass();
 public T getResult();  
}

实现该接口的类:

package org.processor.interfaces.impl;
import org.filter.interfaces.IFile;
import org.processor.interfaces.Processor;
import org.processor.interfaces.ProcessorResult;

public class ProcessorResultImpl<T> implements ProcessorResult<T> {

private T result;
private String processorName;
private IFile file;

public  ProcessorResultImpl(T result) {
  this.t = result;
}

@Override
public IFile getFile() {
  return file;
}

@Override
public String getProcessorName() {
  return processorName;
}

@Override
public Class<? extends Processor<T>> getProcessorClass() {
  return null;
}

@Override
public T getResult() {
  return t;
}
}

我想要实例化此类的对象的时刻是在方法中返回ProcessorResult,如下所示(这只是为了演示):

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;

import org.filter.interfaces.IFile;
import org.processor.interfaces.Processor;
import org.processor.interfaces.ProcessorFilter;
import org.processor.interfaces.ProcessorResult;

public class ProcessorLineCountImpl<T> implements Processor<T> {

  private ProcessorFilter<T> processorFilter;
  private String name;

  public ProcessorLineCountImpl() {

  }

  public ProcessorResult<T> process(IFile file) {
    int count = 0;
    try (Scanner sc = new Scanner(file.openInputStream())) {
      while (sc.hasNext()) {
        String word = sc.next();
        if (word.indexOf("\\") == -1) {
          count++;
        }
      }
   return null;
}
return null;

@Override
public String getName() {
  return name;
}

@Override
public void setFilter(ProcessorFilter<T> filter) {
   this.processorFilter = filter;
}

在这种情况下,我的语法错误

Type mismatch: cannot convert from ProcessorResultImpl<Long> to 
ProcessorResult<T>

问题:

  1. 如何正确完成,因为我没有想法,也无法在网络上找到任何解决方案。
  2. 延迟确定类型直到对象实例化是一种好方法吗?
  3. 感谢您的任何建议。

1 个答案:

答案 0 :(得分:0)

我不知道这个process方法的来源,因为您没有将它包含在您列出的任何类中。但是,因为此方法将根据其中一个参数简单地创建并返回一个新类,所以最好将其作为static实用程序方法,这不需要重写它。此外,甚至没有使用file参数,因此可以将其删除:

public static ProcessorResult<T> process(T result) {
    return new ProcessorResultImpl<T>(result);
}

现在可以通过以下方式调用该方法,以生成之前的等效输出:

public class ... implements ...<Long> {

    public static void main(String... args) {
        Somewhere.process(10L);
    }

}