【问题标题】:implement generic generic interface in scala在 scala 中实现通用的通用接口
【发布时间】:2015-08-19 20:16:09
【问题描述】:

我需要从 scala 创建一个 java 对象,而不是它有一个方法,它需要一个参数,它是一个通用接口

java类

public class JavaTest<T> {
    public List<T> add(IJavaTest<T> javaTest){
        return null;
    }
}

java接口

public interface IJavaTest<T> {
    String ss();
}

在 scala 中我实现了这个:

val javaTest = new JavaTest

class TMijavatest[T] extends IJavaTest[T] {
  override def ss(): String = ""
}

val foo=new TMijavatest()

但是当我调用 add 方法时

javaTest.add(foo);

我在 intellij 中有这个错误: 类型不匹配,预期:IJavaTest[T],实际 TMijavatest[Nothing]

与:

javaTest.add(foo.asInstanceOf);

它编译了我,但在执行时我有这个错误:

服务器发生意外错误。 原因:java.lang.ClassCastException: my.pakage.Test$TMijavatest$1 无法转换为 scala.runtime.Nothing$

如果我像这样生成 foo 对象:

 val foo = new TMijavatest[String]
 javaTest.add(foo);

我在 intellij 中有这个错误: 类型不匹配,预期:IJavaTest[T],实际 TMijavatest[String]

我该怎么做?谢谢

【问题讨论】:

  • Class TMijavatest 接受类型参数,但您在没有类型参数的情况下实例化它,因此推断 Nothing。指定类型参数。例如:val foo = new TMijavatest[String]()
  • JavaTest 类也是如此。它是一个泛型类型,因此你应该用一个类型来实例化它,例如val javaTest = new JavaTest[String].

标签: java scala


【解决方案1】:

你应该用 type 实例化 JavaTest 和 TMijavatest

val javaTest = new JavaTest[String]

class TMijavatest[T] extends IJavaTest[T] {
  override def ss(): String = ""
}

val foo = new TMijavatest[String]

javaTest.add(foo)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    相关资源
    最近更新 更多