【发布时间】:2011-09-29 04:16:12
【问题描述】:
我有这种方法可以使用列表元素的属性之一将List 转换为Map:
简而言之,它看起来像这样:
private Map<String, List<Diagnostic<? extends JavaFileObject>>> toMap( List<Diagnostic<? extends JavaFileObject>> diagnostics ) {
Map<String, List<Diagnostic<? extends JavaFileObject>>> result = new HashMap<String, List<Diagnostic<? extends JavaFileObject>>>();
for ( Diagnostic<? extends JavaFileObject> d : diagnostics ) {
List<Diagnostic<? extends JavaFileObject>> list = null;
if ( !result.containsKey( d.getCode() ) ) {
list = new ArrayList<Diagnostic<? extends JavaFileObject>>();
result.put( d.getCode(), list );
} else {
list = result.get( d.getCode() );
}
assert list != null;
list.add( d );
}
return result;
}
耶!..
我非常喜欢泛型,我在它们之前使用 java,我不想回到 cast all 时代,但是当泛型包含作为元素的泛型元素时,它自身,事情变得一团糟。
我知道在 Java1.7 中我们将能够使用“diamond”运算符,但应该有另一种方式。
这是它在非通用版本中的样子:
private Map toMap( List diagnostics ) {
Map result = new HashMap();
for( Object o : diagnostics ) {
Diagnostic d = ( Diagnostic ) o;
List list = null;
if( !result.containsKey( d.getCode() ) ) {
list = new ArrayList();
result.put( d.getCode() , list );
} else {
list = result.get( d.getCode() );
}
assert list != null;
list.add( d );
}
return result;
}
大概,我没有尝试编译它。
其他语言如何处理这个问题?例如 C#?,Scala?我非常喜欢 SML 或 Haskell 处理的方式,但我认为过多的魔法可能会伤害(但这当然是主观的)
有解决办法吗?
【问题讨论】:
-
你的程序需要 还是可以只使用
或接口? -
我感受到了你的痛苦——你看过 Lombok 并且它使用
val来推断类型吗? (projectlombok.org/features/val.html) 它并没有清除整个混乱,但它确实缩小了代码。 C# 中的var提供了类似的解决方案。 -
一个明显的解决方法是在你的方法中使用原始类型,如果你接受编译器警告和类型错误的风险,但我同意干净的代码是丑陋的。
-
@JustinKSU 我需要
<? extends JavaFileObject>我以后会用它
标签: c# java generics scala static-typing