System.out.println(GraphController.GRAPHPOOL.peek().getEdge());
    Stream.generate(() -> {
     try {
       return GraphController.GRAPHPOOL.take();
     } catch (InterruptedException ie) {
       return "Interrupted!";
     }
    })
    .forEach(g   -> {System.out.println(g.getEdge());}
    });


我可以打印出EdgegetEdge返回的对象Stream.generate().forEach(),但是,在forEach中,我只能访问对象g

尝试访问g.getEdge()时,出现如下错误:


  error: cannot find symbol
  
  System.out.println(g.getEdge());
  
  symbol: method getEdge()
  
  location: variable g of type Object


如何访问g.getEdge()

最佳答案

由于调用GraphController.GRAPHPOOL.take();返回与语句return "Interrupted!"不同的类型,generate中间方法返回的元素都将为Object类型,并且在getEdge()类中没有这样的方法称为Object 。要解决该问题,您可以执行以下操作:

.forEach(g -> {
       if(g instanceof TheType){
           System.out.println(((TheType)g).getEdge());
       }
       else{
           // "interrupted"
       }
   });


另外,请注意,方法generate(Supplier<T> s)返回无限的顺序流,通常在这种情况下,您将要使用limit截断该流。

07-27 13:22