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

可以在一个类中同时实现scala.collection.Seq[T]和java.util.List[T]吗,java,scala,collections,Java,Scala,Collections,我正在用Scala编写一个库,我希望能够从Scala和Java中自然地使用它。我认为可以编写一个类来扩展scala.collection.IndexedSeq[T]并实现java.util.List[T]。我能够通过创建一个实现了scala.collection.iterator和java.util.iterator的类来处理iterator方法上的冲突,但由于错误而受阻 继承成员之间的名称冲突: def在特征列表中包含(x$1:Any):布尔值 def在trait-SeqLike中包含[A1>

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

继承成员之间的名称冲突:
def在特征列表中包含(x$1:Any):布尔值
def在trait-SeqLike中包含[A1>:T](元素:A1):布尔值
擦除后具有相同类型:
(x$1:Object)布尔值

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

这是可能的,但这需要大量的工作,并且可能涉及一些肮脏的操作

不能在Scala中实现这两种类型,因为Scala编译器是类型安全的。 但是,Java编译器仍然可以处理省略泛型类型参数的问题

因此,这是我对一项计划的建议——但不保证它会起作用:

  • 创建一个扩展具体Scala集合类型的Java类,例如
    ArrayBuffer
    ,并实现
    Java.util.List
  • 省略所有泛型类型参数
  • 制作一个Scala
    对象
    ,该对象具有一个工厂方法,该工厂方法使用java.util.List[T]
返回
ArrayBuffer[T]
  • 工厂方法创建第一步中提到的类的实例,并将其强制转换为返回类型
  • 在尝试这一点时,我的IntelliJ想法变得非常缓慢——可能是因为Scala集合类型的巨大类型层次结构。 所以我不能真正测试这个

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

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

    我会给你一个骨架

    首先是Java类框架,带有
    UnsupportedOperationException
    s供您填写:

    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互操作性的边界。

    这可能是可能的,但这需要大量的工作,而且可能会涉及一些肮脏的操作

    不能在Scala中实现这两种类型,因为Scala编译器是类型安全的。 但是,Java编译器仍然可以处理省略泛型类型参数的问题

    因此,这是我对一项计划的建议——但不保证它会起作用:

    • 创建一个扩展具体Scala集合类型的Java类,例如
      ArrayBuffer
      ,并实现
      Java.util.List
    • 省略所有泛型类型参数
    • 制作一个Scala
      对象
      ,该对象具有一个工厂方法,该工厂方法使用java.util.List[T]
    返回
    ArrayBuffer[T]
    
  • 工厂方法创建第一步中提到的类的实例,并将其强制转换为返回类型
  • 在尝试这一点时,我的IntelliJ想法变得非常缓慢——可能是因为Scala集合类型的巨大类型层次结构。 所以我不能真正测试这个

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

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

    我会给你一个骨架

    首先是Java类框架,带有
    UnsupportedOperationException
    s供您填写:

    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互操作性的边界。

    这可能是可能的,但这需要大量的工作,而且可能会涉及一些肮脏的操作

    不能在Scala中实现这两种类型,因为Scala编译器是类型安全的。 但是,Java编译器仍然可以处理省略泛型类型参数的问题

    因此,这是我对一项计划的建议——但不保证它会起作用:

    • 创建一个扩展具体Scala集合类型的Java类,例如
      ArrayBuffer
      ,并实现
      Java.util.List
    • 省略所有泛型类型参数
    • 制作一个Scala
      对象
      ,该对象具有一个工厂方法,该工厂方法使用java.util.List[T]
    返回
    ArrayBuffer[T]
    
  • 工厂方法创建第一步中提到的类的实例,并将其强制转换为返回类型
  • 在尝试这一点时,我的IntelliJ想法变得非常缓慢——可能是因为Scala集合类型的巨大类型层次结构。 所以我不能真正测试这个

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

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

    我给你打个电话