如何将Scala高阶类型特征的混合类型与Java泛型类型匹配? [英] how match mixed type of scala higher-kinder types feature with java generic type?

查看:126
本文介绍了如何将Scala高阶类型特征的混合类型与Java泛型类型匹配?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的项目是Java和Scala语言的混合体,但是会出现一些类型不匹配错误,我认为这是Java和Scala交流方面的常见问题. 我用简单的班级安排了舞台​​.环境是Java 1.8和Scala 2.11.7

my project is mixed java and scala language, but some type mismatch error occur and I think it's a common problem in term of java and scala communicate. I organized the stage with simple classes. Environment is java 1.8 and 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 [_]]类型?

In other word, how does the java represent scala's Packet[Item[_]] type?

不是. Java根本没有更高类型的类型. MM种类较多的信息隐藏在@ScalaSignature内部.

It doesn't. Java simply doesn't have higher-kinded types. The information that MM is higher-kinded is hidden inside @ScalaSignature.

编写Packet<Item>时,您使用的是原始类型(因此,在Scala中代表);您不能在newPacketInJava中使用Item<Something>.

When you write Packet<Item>, you are using a raw type (which, in turn, can't be represented in Scala); you couldn't use Item<Something> inside newPacketInJava.

这篇关于如何将Scala高阶类型特征的混合类型与Java泛型类型匹配?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆