【问题标题】:Java. Factory creation should return Generic class爪哇。工厂创建应该返回通用类
【发布时间】:2020-06-30 11:05:34
【问题描述】:

有人可以帮忙吗。
我想创建一个工厂,它会返回特定的类。

上线有问题 - filterFactory.getFilter(myColumn.getType()).setMin(5); 出现错误:无法解析“对象”中的方法“setMin”

public enum Columns {
  Name(ColumnType.String),
  Age(ColumnType.Numeric);

  private final ColumnType type;

  Columns(ColumnType type) {
    this.type = type;
  }

  public ColumnType getType() {
    return type;
  }
}

public enum ColumnType {
  String,
  Numeric
}


public class NumericFilter extends ColumnFilter {
  public void setMin(int min) {
    System.out.println("min is set" + min);
  }
}

public class StringFilter extends ColumnFilter {
  public void setFilter(String filter) {
    System.out.println("filter is set to:" + filter);
  }
}

public class ColumnFilterFactory {
  public <T> T getFilter(ColumnType type) {
    if (type == null) {
      return null;
    }
    if (type == ColumnType.String) {
      return (T) new StringFilter();

    } else if (type == ColumnType.Numeric) {
      return (T) new NumericFilter();
    }

    return null;
  }
}

public class BasicTest {
  public static void main(String[] args) {
    Columns myColumn = Columns.Age;
    ColumnFilterFactory filterFactory = new ColumnFilterFactory();
    filterFactory.getFilter(myColumn.getType()).setMin(5);
  }
}

【问题讨论】:

  • 有什么问题?你有什么错误吗?添加整个消息/堆栈跟踪。
  • 无法解析“对象”中的方法“setMin”
  • setMin 是超类 ColumnFilter 的一部分,不应该定义为&lt;T extends ColumnFilter&gt;吗?

标签: java factory


【解决方案1】:

编译器无法知道工厂将返回什么类型,所以你需要给它一点帮助。例如通过使用中间变量:

NumericFilter nf = filterFactory.getFilter(myColumn.getType());
nf.setMin(5);

【讨论】:

  • 如果我们知道返回类型是NumericFilter,那么在这里写工厂的目的是什么
  • 这是我的 OP 的问题吗?工厂的通常好处是您不必知道实例是如何构建的或 NumericFilter 将返回哪个具体实现(如果有多个)
  • 谢谢。它是给你的,但ColumnFilter 是我们这里的抽象类。您的答案中的 nf 类型是否正确?我认为 nf 类型应该是ColumnFilter
猜你喜欢
  • 2017-12-31
  • 2016-07-21
  • 2011-04-16
  • 2012-07-23
  • 2014-08-11
  • 2022-01-27
  • 1970-01-01
  • 2013-08-31
  • 2016-11-08
相关资源
最近更新 更多