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

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

概述我有这个方法使用列表元素的一个属性将List转换为Map: 简而言之,它看起来像这样: private Map<String, List<Diagnostic<? extends JavaFileObject>>> toMap( List<Diagnostic<? extends JavaFileObject>> diagnostics ) { Map<String, List<Diagn 我有这个方法使用列表元素的一个属性将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.这将使它更清洁.

总结

以上是内存溢出为你收集整理的c# – 我们可以用Java中的泛型做些什么来使它们看起来更好:全部内容,希望文章能够帮你解决c# – 我们可以用Java中的泛型做些什么来使它们看起来更好:所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/1238902.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存