【问题标题】:Getting: The target type of this expression must be a functional interface获取:这个表达式的目标类型必须是函数式接口
【发布时间】:2021-11-17 16:24:29
【问题描述】:

我正在使用此代码:

return Arrays.asList(dataSet.getTableNames()).toArray(String[]::new);

【问题讨论】:

  • getTableNames() 返回什么类型?如果它是String[],这应该可以工作,但你也会得到一个String[],将其转换为List<String>,然后将其转换回String[]

标签: arrays java-8


【解决方案1】:

toArray(String[]::new) 需要 JDK 11。令人困惑的错误消息源于存在 toArray method with one parameter 但与 String[]::new 不兼容的事实。

您可以使用像toArray(new String[0]) 这样的Java 8 方法来实现相同的目的。

但是,也许您将 Collection 方法与the Stream API method 混淆了。如果你使用

  • return Arrays.stream(dataSet.getTableNames()).toArray(String[]::new);
    

    (注意stream 而不是asList

    如果dataSet.getTableNames() 返回一个数组,或者

  • return dataSet.getTableNames().stream().toArray(String[]::new);
    

    如果getTableNames() 返回List(或任何类型的Collection

它会起作用的。

但无论哪种情况,这都是不必要的绕道。

  • 如果getTableNames()返回一个String[]数组,你可以简单地使用

    return dataSet.getTableNames().clone();
    
  • 如果getTableNames() 返回一个Object[] 数组但已知仅包含String 元素,则可以使用

    Object[] array = dataSet.getTableNames();
    return Arrays.copyOf(array, array.length, String[].class);
    
  • 如果getTableNames() 返回Collection,则使用

    return dataSet.getTableNames().toArray(new String[0]);
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多