【问题标题】:Converting java to scala with Generics使用泛型将 java 转换为 scala
【发布时间】:2019-08-18 10:51:30
【问题描述】:

我有下一个 Java 代码:

public static <T> T buildSAMLObject(final Class<T> clazz) {
    T object = null;
    try {
        XMLObjectBuilderFactory builderFactory = XMLObjectProviderRegistrySupport.getBuilderFactory();
        QName defaultElementName = (QName)clazz.getDeclaredField("DEFAULT_ELEMENT_NAME").get(null);
        object = (T)builderFactory.getBuilder(defaultElementName).buildObject(defaultElementName);
    } catch (IllegalAccessException e) {
        throw new IllegalArgumentException("Could not create SAML object");
    } catch (NoSuchFieldException e) {
        throw new IllegalArgumentException("Could not create SAML object");
    }

    return object;
}

我正在尝试将其转换为 Scala,到目前为止我得到了:

def buildSAMLObject(clazz: asInstanceOf[T]): [T] T  {
    var obj = builderFactory.getBuilder(defaultElementName).buildObject(defaultElementName).asInstanceOf[T];
    try {
        val builderFactory = XMLObjectProviderRegistrySupport.getBuilderFactory();
        val defaultElementName = clazz.getDeclaredField("DEFAULT_ELEMENT_NAME").get(null).asInstanceOf[QName];
        obj = builderFactory.getBuilder(defaultElementName).buildObject(defaultElementName).asInstanceOf[T];
    } catch 
         {
            case e: IllegalAccessException => throw new IllegalArgumentException("Could not create SAML object")
            case e: NoSuchFieldException   => throw new IllegalArgumentException("Could not create SAML object")
         }

    obj
}

后者没有编译,我相信这是因为我不知道如何表示[T] T。请有什么建议吗?

【问题讨论】:

  • 这里没有理由在 Java 或 Scala 中将 object 设为可变变量。只需在 Java 中的块内执行 return 并使用在 Scala 中返回最后一个值的事实。

标签: java scala generics playframework try-catch


【解决方案1】:

方法签名中的泛型导致错误,应该是这样的:

def buildSAMLObject[T](clazz: Class[T]): T  = {

P.S.:在 scala 中,换行符 sumbol 相当于分号,你不需要写它们。

【讨论】:

  • 另一个问题:Scala 等价于 T object = null 是什么?如果我使用 var obj = null 我可能会得到与数据类型相关的错误
  • 有一个Null 类,虽然你的意思是Nothing。但这里最好使用try 的属性,它返回值。只需写var object = try {...}
  • 你也可以写var object: T = null,但是由于你是在Scala中,你可能会尽量避免突变、空值、副作用等。并且编写更地道的代码.而不是仅仅翻译 Java - 但是,如果你不能或根本不想,总有办法。
  • 你不能写 var object: T = null 因为 T 可能是例如Int。它需要对T 的约束,[T &lt;: AnyRef](更标准)或[T &gt;: Null]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-28
  • 1970-01-01
相关资源
最近更新 更多