【问题标题】:Implementing generic interface in generic class在泛型类中实现泛型接口
【发布时间】:2017-07-15 09:00:42
【问题描述】:

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

我的代码如下:

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. 将类型确定延迟到对象实例化是一种好方法吗?

感谢您的建议。

【问题讨论】:

  • 这完全没有意义——如果它是通用的,那你为什么要硬编码Long
  • 这个process方法是在哪里定义的?
  • process需要返回ProcessorResult&lt;Long&gt;
  • @OliverCharlesworth 我知道,因为我是泛型的新手,我真的很想知道如何正确完成它,正如你提到的,我希望它不是硬编码为长但也支持其他类型。

标签: java generics interface


【解决方案1】:

我不知道这个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);
    }

}

【讨论】:

  • Edited my post(above) with class within process() method is defined, 我的主要目标是返回 ProcessResult 哪个 T 类型将是 Long 或 Integer 取决于它是小还是大文件。
  • @user8071107 如果是这种情况,那么如果您只打算返回IntegerLong,则无需使用T。只需使用Number 并在运行时返回IntegerLong,因为它们都扩展Number 并且不需要显式类型转换。
  • 如果不是要求之一,我可能会这样做。有什么办法可以保留 ProcessorResult 并以某种方式返回它已经定义的类型?
  • 你确实应该早些提到这些限制,所以我不必不断改变我的答案,但你能做的最好的事情是,而不是T,将类定义为T extends Number .它仍然是通用的,您仍然应该能够在运行时返回 IntegerLong
  • 如果你能在这里放一些简单的例子,那将意味着很多,因为我试过了,但我遇到了一堆错误;/ .
猜你喜欢
  • 1970-01-01
  • 2020-05-14
  • 1970-01-01
  • 1970-01-01
  • 2016-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多