Потоковая операция возвращает объект вместо списка - PullRequest
0 голосов
/ 12 октября 2018

У меня есть следующий код, который выполняется так, как я намереваюсь:

import java.util.*;
import java.util.stream.Collectors;

public class HelloWorld{

 public static void main(String []args){
    HelloWorld.TreeNode rootNode = new HelloWorld().new TreeNode<Integer>(4);
    List<Integer> traversal = rootNode.inorderTraversal();
    // Prints 4
    System.out.println(
        String.join(",",
            traversal
                .stream()
                .map(Object::toString)
                .collect(Collectors.toList())
        )
    );
 }

 class TreeNode<K extends Comparable<K>> {

     TreeNode<K> left;
     TreeNode<K> right;
     K val;

     TreeNode(K val, TreeNode<K> left, TreeNode<K> right) {
         this.val = val;
         this.left = left;
         this.right = right;
     }

     TreeNode(K val) {
         this(val, null, null);
     }

     List<K> inorderTraversal() {
         List<K> list = new ArrayList<>();
         list.add(this.val);
         return list;
     }

 }
}

Однако, если я заменяю закомментированную строку на

System.out.println(
    String.join(",",
        rootNode.inorderTraversal()
            .stream()
            .map(Object::toString)
            .collect(Collectors.toList())
    )
);

, я получаю следующую ошибку:

HelloWorld.java:14: error: no suitable method found for join(String,Object)
        String.join(",",
              ^
method String.join(CharSequence,CharSequence...) is not applicable
  (varargs mismatch; Object cannot be converted to CharSequence)
method String.join(CharSequence,Iterable<? extends CharSequence>) is not 
applicable
  (argument mismatch; Object cannot be converted to Iterable<? extends 
CharSequence>)
Note: HelloWorld.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
1 error

Я видел эту очень похожую проблему ( Почему эта потоковая операция java 8 оценивается как Object вместо List или просто List? ), но я не вижу, как мое решениене обходит проблему, возникшую у пользователя, потому что rootNode.inorderTraversal() возвращает List<Integer> вместо List.

Заранее благодарим за любую помощь!

1 Ответ

0 голосов
/ 12 октября 2018

Это потому, что вы используете необработанные типы.Параметризовать его с помощью общих типов, как это.

HelloWorld.TreeNode<Integer> rootNode = new HelloWorld().new TreeNode<>(4);

Это решит проблему.Если вы не предоставите параметр общего типа в левой части, список будет объявлен как необработанный тип.

...