java - 是否可以在一个类中同时实现 scala.collection.Seq[T] 和 java.util.List[T]

标签 java scala collections

我正在用 Scala 编写一个库,我希望能够自然地从 Scala 和 Java 中使用它。我认为可以编写一个扩展 scala.collection.IndexedSeq[T] 并实现 java.util.List[T] 的类。我能够通过创建一个实现 scala.collection.Iterator 和 java.util.Iterator 的类来处理迭代器方法上的冲突但我被错误所困扰

name clash between inherited members:
def contains(x$1: Any): Boolean in trait List and
def contains[A1 >: T](elem: A1): Boolean in trait SeqLike
have same type after erasure: (x$1: Object)Boolean

有什么办法可以解决这个错误吗?方法实现是相同的,因此它们实际上可以删除为相同的类型。我应该放弃这个愚蠢的差事并使用隐式转换并只处理分配开销吗?

最佳答案

也许是可能的,但是工作量很大,并且可能涉及一些肮脏的操作。

您无法在 Scala 中实现这两种类型,因为 Scala 编译器是类型安全的。 然而,Java 编译器仍然可以处理省略泛型类型参数的情况。

所以这是我的计划提案 - 不保证它会起作用:

  • 创建一个扩展具体 Scala 集合类型的 Java 类,例如 ArrayBuffer实现 java.util.List
  • 省略所有泛型类型参数。
  • 创建一个 Scala 对象,该对象具有一个工厂方法,该方法使用 java.util.List[T] 返回 ArrayBuffer[T]
  • 工厂方法创建第一步中提到的类的实例,并将其转换为返回类型。

在尝试该方法时,我的 IntelliJ IDEA 变得极其缓慢——大概是因为 Scala 集合类型的类型层次结构庞大。 所以我无法真正测试这个。

请注意,这可能会导致谁知道会发生什么奇怪的错误。 我绝对不会推荐这个!

此外,在 Scala 中,您始终必须使用 java.util.List[T] 将类型声明为 ArrayBuffer[T],并为其定义类型别名。

我会给你一个骨架。

首先是 Java 类框架,其中包含 UnsupportedOperationException 供您填写:

import scala.collection.generic.Subtractable;
import scala.collection.mutable.ArrayBuffer;

import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

class MySeqList extends ArrayBuffer implements List {
public static abstract class SeqListIterator implements Iterator, scala.collection.Iterator {
}

@Override
public Subtractable repr() {
    return (Subtractable)super.repr();
}

public boolean add(Object e) {throw new UnsupportedOperationException();}
public Object get(int i) {throw new UnsupportedOperationException();}
public Object set(int i, Object e) {throw new UnsupportedOperationException();}
public void add(int i, Object e) {throw new UnsupportedOperationException();}
public Object remove(int i) {throw new UnsupportedOperationException();}
public int indexOf(Object o) {throw new UnsupportedOperationException();}
public int lastIndexOf(Object o) {throw new UnsupportedOperationException();}
public void clear() {throw new UnsupportedOperationException();}
public boolean addAll(int i, Collection collection) {throw new UnsupportedOperationException();}
public SeqListIterator iterator() {throw new UnsupportedOperationException();}
public ListIterator listIterator() {throw new UnsupportedOperationException();}
public ListIterator listIterator(int i) {throw new UnsupportedOperationException();}
public List subList(int i, int i1) {throw new UnsupportedOperationException();}
public boolean equals(Object o) {throw new UnsupportedOperationException();}
public int hashCode() {throw new UnsupportedOperationException();}
protected void removeRange(int i, int i1) {throw new UnsupportedOperationException();}
public int size() {throw new UnsupportedOperationException();}
public boolean isEmpty() {throw new UnsupportedOperationException();}
public boolean contains(Object o) {throw new UnsupportedOperationException();}
public Object[] toArray() {throw new UnsupportedOperationException();}
public Object[] toArray(Object[] ts) {throw new UnsupportedOperationException();}
public boolean remove(Object o) {throw new UnsupportedOperationException();}
public boolean containsAll(Collection collection) {throw new UnsupportedOperationException();}
public boolean addAll(Collection collection) {throw new UnsupportedOperationException();}
public boolean removeAll(Collection collection) {throw new UnsupportedOperationException();}
public boolean retainAll(Collection collection) {throw new UnsupportedOperationException();}
public String toString() {throw new UnsupportedOperationException();}
}

现在出现了 Scala 对象:

import scala.collection.mutable.ArrayBuffer

object SeqList {
  def apply[T]():ArrayBuffer[T] with java.util.List[T] = new MySeqList().asInstanceOf[ArrayBuffer[T] with java.util.List[T]]
}

我想再次强调,这是非常臭的代码。 这看起来不是一个好的解决方案。 您在实现这些方法时可能会遇到各种麻烦。不确定您是否会遇到任何阻碍。

我只是为了好玩而尝试这个来探索 Scala/Java 互操作性的边界。

关于java - 是否可以在一个类中同时实现 scala.collection.Seq[T] 和 java.util.List[T],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24209606/

相关文章:

scala - 使用喷雾发送带有 json 的帖子?

java - 如何在 Spring Security 3.1 中使用 acl_entry 表中的 mask 字段?

scala - Sbt native 打包程序找不到 SystemdPlugin

scala - 如何从使用 simple-build-tool 构建+发布的工件中删除 _<scala-version> 后缀?

java - Java 8 Stream 是我正在寻找的解决方案吗?

python - `namedtuple` 在内存使用上真的和元组一样高效吗?我的测试说不

java - 收集 Map.Entry 第一个值到 map 中

java - 如何关注表格中的 JTextField

java - 如何更改实现 MigLayout 的 JDesktopPane 中显示的 JInternalFrame 的大小?

java - VisualVM - 无法采样 CPU/内存