c# – 我们可以用Java中的泛型做些什么来使它们看起来更好:

我有这个方法使用列表元素的一个属性将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;
}

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;
}

大概,我没有尝试编译它.

其他语言如何处理?例如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;
}

上面你将看到定义为< T extends JavaFileObject>的类型参数.并且您可以在任何需要的地方重复使用T.这将使它更清洁.

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...