【问题标题】:how match mixed type of scala higher-kinder types feature with java generic type?如何将混合类型的 scala 高级类型功能与 java 泛型类型匹配?
【发布时间】:2016-04-05 04:13:02
【问题描述】:

我的项目是混合java和scala语言,但是会出现一些类型不匹配的错误,我认为这是java和scala通信方面的常见问题。 我用简单的课程组织了舞台。环境是java 1.8和scala 2.11.7

class Item[+T](name: String)

//ready use Item as MM type
class Packet[+MM[_]]

object GenS extends App {
  //use Item class
  def doWithPacket(packet: Packet[Item]) = {}

  //type error occur on packetFormJava variable form java
  val packetFormJava = GetGenJ.newPacketInJava
  doWithPacket(packetFormJava)

  //run well
  val packetFromScala = new Packet[Item]
  doWithPacket(packetFromScala)
}

而java类就这么简单:

public class GetGenJ {
    public static Packet<Item> newPacketInJava() {
        return new Packet<Item>();
    }
}

遇到的编译错误:

Error:(16, 16) type mismatch;  
 found   : Packet[Item[_]]  
 required: Packet[Item]  
  doWithPacket(packetFormJava)  
                  ^

任何帮助或建议,谢谢。

【问题讨论】:

  • 也就是说java如何表示scala的Packet[Item[_]]类型?
  • 在 Scala 中添加实用程序方法是一种选择吗?这可能是最简单的解决方案。我不确定您是否可以在 Java 中表示更高种类的类型。
  • hi @0__ ,Item[ _ ] 应该代表 Java 中的更高种类的类型。看来我可能会避免 Java 代码返回更高类型的类型。无论如何,谢谢

标签: java scala generics types scala-java-interop


【解决方案1】:

也就是说,java如何表示scala的Packet[Item[_]]类型?

它没有。 Java 根本没有更高种类的类型。 MM 更高种的信息隐藏在@ScalaSignature 中。

当您编写Packet&lt;Item&gt; 时,您使用的是raw type(反过来,它不能在Scala 中表示);你不能在newPacketInJava中使用Item&lt;Something&gt;

【讨论】:

  • 谢谢,我会避免在java中做higher kinder types。关于raw type的讨论似乎是一个遗留问题。新年快乐~
猜你喜欢
  • 1970-01-01
  • 2015-04-09
  • 2013-07-06
  • 2013-12-21
  • 1970-01-01
  • 2015-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多