Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何实现在Scala中没有特定类型可比扩展的Java接口?_Java_Scala_Generics_Interface - Fatal编程技术网

如何实现在Scala中没有特定类型可比扩展的Java接口?

如何实现在Scala中没有特定类型可比扩展的Java接口?,java,scala,generics,interface,Java,Scala,Generics,Interface,我在Scala项目中使用一个Java库,它有一个如下所示的界面: public interface A extends Comparable { String getSomething(); } 请注意,库实现如何不为Java的可比接口指定任何特定类型 在我的Scala代码中,我想创建一个类似的实例: object AFactory { def getA: A = new A { override def getSomething: String = "test"

我在Scala项目中使用一个Java库,它有一个如下所示的界面:

public interface A extends Comparable {
    String getSomething();
}
请注意,库实现如何不为Java的
可比接口指定任何特定类型

在我的Scala代码中,我想创建一个类似的实例:

object AFactory {
  def getA: A = new A {
    override def getSomething: String = "test"
    override def compareTo(o: ???): Int = -1
  }
}

不幸的是,我不确定要为
指定什么类型。有人知道我如何实现这个接口并编译它吗?

没有直接的方法。让代码针对java5之前的代码运行的一种方法是使用Java桥方法:

public abstract class B implements A {
    @Override
    public int compareTo(Object o) {
        return 0;
    }
}

object AFactory {
  def getA: A = new B {
    override def getSomething: String = "test"
  }
}
如果您不想在Java中实现
比较
。您可以引入桥接方法并在scala中实现桥接方法:

public abstract class B implements A {
    @Override
    public int compareTo(Object o) {
        return compareToBridge(o);
    }

    protected abstract int compareToBridge(Object o);
}

object AFactory {
  def getA: A = new B {
    override def getSomething: String = "test"

    override def compareToBridge(o: Any): Int = ???
  }
}

如果不使用桥接方法,我认为没有更好的方法来解决这个问题。

也许可以尝试
任何
?我不知道足够的Scala来帮助解决这个问题,但是没有类型参数的泛型类型被称为“原始类型”(严格来说,这只是为了向后兼容,现代代码不应该使用它们)。也许这有助于你在谷歌上搜索解决方案。当你让IDE自动完成
覆盖
时,它会创造一些有用的东西吗?方法丢失时的编译错误也可能提供信息。看起来可能不可能:原始类型用于1.5 Java之前的兼容性。他们很坏。停止使用它们。另请参见此处的类似问题: