Java泛型

时间:2020-03-05 18:46:02  来源:igfitidea点击:

是否有任何简便的方法来定义和使用泛型定义,而不必继续重复特定的泛型描述,这样,即使有更改,我也不必更改所有定义/用法,尽管例如在代码库中可能是这样的:

Typedef myGenDef = < Object1, Object2 >;

HashMap< myGenDef > hm = new HashMap< myGenDef >();

for (Entry< myGenDef > ent : hm..entrySet())
{
.
.
.
}

解决方案

回答

不会。但是,groovy是一种JVM语言,是动态输入的,可以让我们编写:

def map = new HashMap<complicated generic expression>();

回答

有伪typedef反模式...

class StringList extends ArrayList<String> { }

好东西,喝吧! ;-)

如本文所述,该技术存在一些严重的问题,主要是该" typedef"实际上是一个单独的类,因此不能与其扩展的类型或者其他类似定义的类型互换使用。

回答

在通用方法中,可以使用类型推断的有限形式来避免某些重复。

示例:如果我们具有该功能

<K, V> Map<K, V> getSomething() {
        //...
    }

我们可以使用:

final Map<String, Object> something = getsomething();

代替:

final Map<String, Object> something = this.<String, Object>getsomething();

回答

使用工厂模式创建泛型:

方法样本:

public Map<String, Integer> createGenMap(){
        return new HashMap<String,Integer>();

    }

回答

Shog9提到的伪typedef反模式可以使用,尽管不建议使用ANTIPATTERN,但它不能满足意图。伪typedef的目标是减少声明中的混乱并提高可读性。

我们想要的是能够通过一次交易替换一组泛型声明。我认为我们必须停下来思考:"以女巫的方式有价值吗?"。我的意思是,我无法想到我们需要此方案的情况。想象一下A类:

class A {
     private Map<String, Integer> values = new HashMap<String, Integer>();
}

现在想像一下,我想将"值"字段更改为地图。为什么会有许多其他字段分散在需要相同更改的代码中?对于使用"值"的操作,简单的重构就足够了。