T_Archer 2020-10-15 21:40 采纳率: 0%
浏览 886

illegal cyclic inheritance involving trait Iterable

Error:(17, 9) illegal cyclic inheritance involving trait Iterable
val resultDataSet: DataSet[(String, Int)] = inputDataSet
刚开始学习scala,idea老是出现这个问题,在网上看到可能是scala的sdk版本太新,但换了版本之后还是不行,有大佬能帮忙解决吗?
下面是代码

import org.apache.flink.api.scala.ExecutionEnvironment

import org.apache.flink.api.scala._
//批处理的WordCount
object WordCount {
def main(args: Array[String]): Unit = {
//创建一个批处理的执行环境
val env: ExecutionEnvironment = ExecutionEnvironment.getExecutionEnvironment

//从文件中读取数据
val inputPath: String = "D:\\Flink\\FlinkTutorial\\src\\main\\resources\\WordCount.txt"
val inputDataSet: DataSet[String] = env.readTextFile(inputPath)

//对数据进行转换处理统计,先分词,再按照word进行分组,最后进行聚合统计
val resultDataSet: DataSet[(String, Int)] = inputDataSet
  .flatMap(_.split(" "))
  .map((_,1))
  .groupBy(0)    //以第一个元素作为key,进行分组
  .sum(1)      //对所有数据的第二个元素求和

//打印输出
resultDataSet.print()

}
}

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-07-25 03:46
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    这个问题是因为在Scala中,trait(继承)不能循环。这意味着如果你在一个类中定义了一个Trait,并且在另一个类中也试图使用这个Trait,那么你将得到一个编译错误。

    在这个例子中,Iterable是一个Trait,当你尝试在一个类中使用它时,你实际上是在尝试在一个已经包含Trait的类中再次使用它,这将导致编译错误。

    为了解决这个问题,你可以考虑以下几种方法:

    1. IterableTrait放在一个独立的包中:这样可以避免在任何类中直接使用它。
    2. 创建一个新的类来实现IterableTrait:然后在你的类中使用这个新的实现。
    3. 如果你需要使用IterableTrait,你可以将其添加到你的类中,但是你需要确保它被正确地实现了。

    例如,你可以这样做:

    class MyClass implements Iterable<String> {
        private List<String> items = new ArrayList<>();
    
        @Override
        public Iterator<String> iterator() {
            return new MyIterator(items);
        }
    
        class MyIterator implements Iterator<String> {
            private int index;
    
            public MyIterator(List<String> items) {
                this.items = items;
            }
    
            @Override
            public boolean hasNext() {
                return index < items.size();
            }
    
            @Override
            public String next() {
                if (!hasNext()) throw new NoSuchElementException();
    
                return items.get(index++);
            }
        }
    }
    

    在这个例子中,我们创建了一个新的类MyClass,它实现了IterableTrait。然后我们在MyClass类中使用了这个新的实现。

    评论

报告相同问题?