1

我正在为Play 2框架的SecureSocial插件编写持久层。我发现了一个例子,在https://github.com/play-modules/modules.playframework.org/blob/master/app/models/ss/MPOOAuth2Info.java在Java中实例化scala.Int

package models.ss; 

import models.AbstractModel; 
import securesocial.core.java.OAuth2Info; 
import javax.persistence.Entity; 

@Entity 
public class MPOOAuth2Info extends AbstractModel 
{ 
    public String accessToken; 

    public String tokenType; 

    public Integer expiresIn; 

    public String refreshToken; 

    public MPOOAuth2Info() 
    { 
     // no-op 
    } 

    public MPOOAuth2Info(OAuth2Info oAuth2Info) 
    { 
     this.accessToken = oAuth2Info.accessToken; 
     this.tokenType = oAuth2Info.tokenType; 
     this.expiresIn = oAuth2Info.expiresIn; 
     this.refreshToken = oAuth2Info.refreshToken; 
    } 

    public OAuth2Info toOAuth2Info() 
    { 
     OAuth2Info oAuth2Info = new OAuth2Info(); 

     oAuth2Info.accessToken = this.accessToken; 
     oAuth2Info.tokenType = this.tokenType; 
     oAuth2Info.expiresIn = this.expiresIn; 
     oAuth2Info.refreshToken = this.refreshToken; 

     return oAuth2Info; 
    } 
} 

但API改变,所以我不能用securesocial.core.java.OAuth2Info。 SecureSocial由Scala编写,这个类是Java前端。所以我决定直接使用Scala的地方:

case class OAuth2Info(accessToken: String, tokenType: Option[String] = None, 
        expiresIn: Option[Int] = None, refreshToken: Option[String] = None) 

我的结果:

package models.security.securesocial; 

import models.AbstractModel; 
import scala.Option; 
import securesocial.core.*; 

import javax.persistence.Entity; 

/** 
* Persistence wrapper for SecureSocial's {@link } class. 
* 
* @author Steve Chaloner ([email protected]) 
*/ 
@Entity 
public class MPOOAuth2Info extends AbstractModel 
{ 
    public String accessToken; 

    public String tokenType; 

    public Integer expiresIn; 

    public String refreshToken; 

    public MPOOAuth2Info(){ 
     // no-op 
    } 

    public MPOOAuth2Info(OAuth2Info oAuth2Info){ 
     this.accessToken = oAuth2Info.accessToken(); 
     this.tokenType = oAuth2Info.tokenType().get(); 
     this.expiresIn = scala.Int.unbox(oAuth2Info.expiresIn().get()); 
     this.refreshToken = oAuth2Info.refreshToken().get(); 
    } 

    public OAuth2Info toOAuth2Info(){ 
     return new OAuth2Info(accessToken, Option.apply(tokenType), Option.apply(SOME_TRANSFORMATION(expiresIn)), Option.apply(refreshToken)); 
    } 
} 

但我有与scala.Int /从java.lang.Integer类型convertation问题。 要将scala.Int转换为java.lang.Integer我使用了scala.Int.unbox()。它是连接方式吗?我不知道如何将java.lang.Integer转换为scala.Int:在代码中输入伪代码SOME_TRANSFORMATION()。这个SOME_TRANSFORMATION的正确实现是什么?

谢谢

+0

看看源代码,它似乎将一个scala.Int转换为java.lang.Integer是scala.Int.box () – Luciano 2013-02-18 20:34:54

回答

5

scala.Int.unbox(new java.lang.Integer(3))Int = 3

scala.Int.box(3)自动,透明地给出Integer = 3

3

斯卡拉盒和unboxes。此外,scala.Int是一种小说。当存储在本地变量中时,它是原生的int(àJava/JVM),作为形式参数传递或存储在类中。但是,当它必须通过参数化/泛型类型的值进行投放时,它必须装箱并拆箱。 (有一个例外,当问题的类型参数是专门的,但这是另一回事。)

+0

它是“àla”。 :) – 2013-06-07 10:15:38

+0

编辑欢迎! – 2013-06-07 12:50:28

+0

我不敢,但现在你说了。 :) – 2013-06-07 12:57:09