Osc*_*Ryz 6 c# java generics scala static-typing
我有这个方法使用列表元素的一个属性List
将a 转换为a 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;
}
Run Code Online (Sandbox Code Playgroud)
Yiack!..
我非常喜欢genercis,我之前使用java并且我不想回到演员阵容的所有时代,但是当一个泛型包含作为元素的通用元素时,它会变得混乱.
我知道在Java1.7中我们将能够使用" 菱形 "运算符,但应该有另一种方法.
这是非通用版本的样子:
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;
}
Run Code Online (Sandbox Code Playgroud)
大概,我没有尝试编译它.
其他语言如何处理?例如C#,Scala?我喜欢SML或Haskell处理的方式,但我认为太多魔法可能会受到伤害(但这当然是主观的)
这有解决方法吗?
您定义一个名为的类型参数T
.然后你可以T
在你的泛型中使用这样的:
private <T extends JavaFileObject> Map<String, List<Diagnostic<T>> toMap(List<Diagnostic<T> diagnostics) {
Map<String, List<Diagnostic<T>> result = new HashMap<String, List<Diagnostic<T>>();
for (Diagnostic<T> d : diagnostics ) {
List<Diagnostic<T>> list = null;
if ( !result.containsKey(d.getCode())) {
list = new ArrayList<Diagnostic<T>>();
result.put( d.getCode(), list );
} else {
list = result.get( d.getCode() );
}
assert list != null;
list.add( d );
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
在上面,您将看到定义的类型参数,<T extends JavaFileObject>
并且您可以在任何需要的地方重复使用T. 这将使它更清洁.
归档时间: |
|
查看次数: |
843 次 |
最近记录: |