使用泛型将Java转换为Scala

Jos*_*iga 2 java generics scala playframework

我有下一个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;
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试将其转换为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
}
Run Code Online (Sandbox Code Playgroud)

后者尚未编译,我相信这是因为我不知道如何表示[T]T。请问任何建议吗?

And*_*cus 5

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

def buildSAMLObject[T](clazz: Class[T]): T  = {
Run Code Online (Sandbox Code Playgroud)

PS:在scala换行符中sumbol相当于分号,您无需编写它们。

  • 您不能编写“ var object:T = null”,因为“ T”可能是“ Int”。它要求对“ T”有一个约束,即“ [T &lt;:AnyRef]”(更标准)或“ [T&gt;:空]”。 (3认同)