【发布时间】:2023-03-30 07:24:01
【问题描述】:
我在 Java 应用程序中使用 Play Framework 2.1.5。
我有一个视图组件,它采用通用对象列表作为参数。在这个组件中,我想迭代列表并获取每个元素的一些属性。
这看起来像这样:
@(elements: List[_])
@for((element, i) <- elements.view.zipWithIndex) {
@i
@element.id
@element.name
}
(我需要这 3 个值)
当然,element.id 和 element.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。
这是我的假设:
铸造元素
使用继承
因为我只需要每个对象的 2 个属性(id 和名称),我可以使用地图,但我需要循环的索引(是否可以从地图中获取它?)它会如果我需要 2 个以上的属性,那就不行了。
也许 Scala 为这类东西提供了语法。
或者我只是看错了方向。
感谢您的帮助。
【问题讨论】:
-
为什么不传递
@(elements: List[GenericObject])?
标签: scala functional-programming playframework-2.0 generic-programming scala-template