1

我在 Java 应用程序中使用 Play Framework 2.1.5。

我有一个将通用对象列表作为参数的视图组件。在这个组件中,我想迭代列表并获取每个元素的一些属性。

这看起来像这样:

@(elements: List[_])

@for((element, i) <- elements.view.zipWithIndex) {
    @i
    @element.id
    @element.name
}

(我需要这 3 个值)

但是,当然,即使我放在列表中的对象类型包含这些方法,也不会编译element.idelement.name所以我这样做了:

@for((element, i) <- elements.view.zipWithIndex) {
    @defining(
        ViewsUtils.getGenericElementId(element),
        ViewsUtils.getGenericElementName(element)) {
            case (id, name, something) =>
                @i
                @id
                @name
        }
}

在 Java 实用程序类中:

public final class ViewsUtils {

    public static String getGenericElementId(Object object) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        return object.getClass().getMethod("getId").invoke(object).toString();
    }

    public static String getGenericElementName(Object object) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        return object.getClass().getMethod("getName").invoke(object).toString();
    }
}

这可行,但我知道这是不对的,因为如果我放入列表中的对象类型不存在这些方法之一,它可能会抛出 RuntimeException。

以下是我的假设:

  1. 铸造元素

  2. 使用继承

  3. 因为我只需要每个对象的 2 个属性(id 和名称),我可以使用地图,但我需要循环的索引(是否可以从地图中获取它?)如果我需要它就行不通超过2个属性。

  4. 也许 Scala 为这类东西提供了语法。

或者,也许我只是在寻找错误的方向。

谢谢您的帮助。

4

1 回答 1

1

好的,这对于评论来说有点太多了,所以我会冒险将其发布为答案。

假设您希望永远不要RuntimeException提到您提到的对象,那么您的对象实现某个接口(或混合一个特征,如 Scala 中所说)是有道理的,因此您不会冒险获得异常并且不再需要反射来获取值.

假设,您声明了这样一个特征:

trait GenericObject {
  val id: Long
  val name: String
}

然后你声明一些案例类:

case class A(id: Long, name: String, someOtherField: SomeType) extends GenericObject {
  //your implementation
}

case class B(id: Long, name: String) extends GenericObject

case class C(id: Long, name: String) extends B(id, name)

现在您可以像这样更改模板:

@(elements: List[GenericObject])

@for((element, i) <- elements.view.zipWithIndex) {
  @i
  @element.id
  @element.name
}

您应该将GenericObjects 列表传递给您的模板:

val myObjects: List[GenericObject] = List(A(1, "A name"), B(2, "B name"), C(3, "C name"))
Ok(your_template.scala.html(myObjects))
于 2014-02-26T12:35:49.310 回答