Что мы можем сделать с дженериками в 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 до них, и я не хочу возвращаться к эпохе 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,но что-то я думаю, что слишком много магии может повредить (но это, конечно, субъективно)

Есть ли обходной путь для этого?

6
задан Kevin Wright 7 July 2011 в 14:49
поделиться