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

时间:2014-06-13 16:05:30

标签: java scala collections

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

  

继承成员之间的名称冲突:
  特征列表中的def contains(x$1: Any): Boolean
  def contains[A1 >: T](elem: A1): Boolean特质SeqLike
  擦除后具有相同的类型:(x$1: Object)Boolean

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

1 个答案:

答案 0 :(得分:3)

可能可能,但这需要很多工作,并且可能涉及一些脏操作。

您无法在Scala中实现这两种类型,因为Scala编译器是类型安全的。 但是,Java编译器仍然可以处理遗漏类型参数。

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

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

尝试这一点时,我的IntelliJ IDEA变得非常慢 - 大概是因为Scala集合类型的巨大类型层次结构。 所以我无法真正测试这个。

请注意,这可能会为谁知道哪些奇怪的错误打开大门。 我绝对不会推荐这个!

此外,在Scala中,您始终必须将类型声明为ArrayBuffer[T] with java.util.List[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 object

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互操作性的界限,以获得乐趣。