【问题标题】:Class type as a parameter in Java类类型作为Java中的参数
【发布时间】:2021-02-13 17:23:21
【问题描述】:

我有一个方法:

private List<ApplicationForVacancy> createListOfApplicationsForVacancy(List<Document> documents) {
        return documents.stream()
                .filter(d -> d instanceof ApplicationForVacancy)
                .map(d -> (ApplicationForVacancy) d)
                .collect(Collectors.toList());
}

但我想在参数中传递类的名称/类的类型并返回方法的类型,如下所示:

private List<TypeOfSomeClass> createList (List<Document> documents, String or Type typeOfSomeClass) {
            return documents.stream()
                    .filter(d -> d instanceof typeOfSomeClass)
                    .map(d -> (typeOfSomeClass) d)
                    .collect(Collectors.toList());
}

有可能吗?我该怎么做?

【问题讨论】:

  • 并非总是如此,但在使用时经常不得不使用instanceof,这表明设计不佳。为什么您的程序需要根据列表中的类型对列表进行排序?
  • 我知道。那是面试考试的强制班级设计。我无法改变它。 List 包含几种类型,我需要将其分隔为几个单独的列表,我想用一种方法来完成。

标签: java oop object methods types


【解决方案1】:

您必须提供一个Class 对象来声明类型并向方法添加类型参数,如下所示:

private static <T> List<T> filterType(List<?> input, Class<T> clazz) {
    return input.stream()
            .filter(clazz::isInstance)
            .map(clazz::cast)
            .collect(Collectors.toList());
}

然后你像这样调用方法:

List<Object> stuff = List.of("String", Integer.valueOf(3), Double.valueOf(42), new Object());
List<String> strings = filterType(stuff, String.class);
List<Number> numbers  = filterType(stuff, Number.class);

strings 将仅包含 Stringnumbers 将包含 2 个数值。

【讨论】:

  • 这正是我正在寻找的。非常感谢你的队友!
  • 您无需手动调用valueOfList.of("String", 3, 42.0, new Object()); 可以。
  • @Holger:我很清楚这一点,但我想让混合类型更加明确。
  • 即便如此,List.of("String", (Integer)3, (Double)42.0, new Object()); 就足够了。
  • @Holger:当然,我只是碰巧更喜欢这种表示法。
【解决方案2】:

据我所知,您无法执行这样的类型转换。但是您可以在方法开始时创建一个新的 List 实例,其中包含指定的类型。然后遍历您现有的列表,过滤掉所有应该包含在结果中的实例。添加这些,然后返回新列表。这里有一些伪代码。

public <T> List<T> filterInstances(List<?> input, Class<T> type){
  List<T> result = new ArrayList<>();
  for(Object o : input){
    if(type.isAssignableFrom(o.getClass()){
      result.add((T)o);
    }
  }
  return result;
}

【讨论】:

  • 解决方案由 Joachim Sauer 发布。你的代码也是正确的;)谢谢伙计!
  • 是的,他的解决方案更适合您的用例。我没有研究 Stream API。我只是试图解释一般程序:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-22
  • 2013-02-16
  • 2023-04-06
  • 2016-04-25
  • 2011-12-14
  • 1970-01-01
相关资源
最近更新 更多