避免为采用Class / GenericType参数的泛型函数重复类型名称

时间:2016-09-22 09:28:02

标签: java generics

给定GenericType之类的函数,或者甚至只是Class<T>,我经常看到序列化代码(JSON,XML等),是否有可能在这样的情况下编写它我不必多次写完整(有时很长)的方式吗?

e.g。就像创建集合时的Java菱形运算符或C ++ 11 auto关键字一样。或者甚至只是一个C风格的typedef风格解决方案(所以我可以创建一个更短的名称,可能是通过使用一个空的初始化变量实例?)。

//What I want to avoid, long "GenericType" parameter
Map<EnterpriseId, List<EnterpriseUser>> usersByEnterprise = Json.readFile(data,
    new GenericType<Map<EnterpriseId, List<EnterpriseUser>>>() { } );

//Creating a container instance
Map<EnterpriseId, List<EnterpriseUser>> usersByEnterprise = new HashMap<>();

2 个答案:

答案 0 :(得分:0)

你可以写:

Map<Id, List<User>> usersByEnterprise = new HashMap<>();

并使用所谓的原始类型&#39;。这避免了泛型类型信息,但也丢弃了地图内容的编译时安全性。它可能被您的IDE和Sonar标记为违反代码,因为我们通常同意泛型打字是一个好主意。

否则你会遇到泛型类型,尽管你可以选择一些较短的名字,例如:

com.github.hierynomus.license

答案 1 :(得分:0)

问题是你需要一个(可恢复的)子类来捕获实际的类型参数,但是Java 8严格规定了为匿名子类显式列出类型参数的要求。如果你需要多次完全相同的类型,你可以做的是保留实例化的类型令牌,这可能会有所帮助,例如

static final GenericType<Map<EnterpriseId, List<EnterpriseUser>>> MAP_ID_USER
       = new GenericType<Map<EnterpriseId, List<EnterpriseUser>>>() { };

…

Map<EnterpriseId, List<EnterpriseUser>> usersByEnterprise=Json.readFile(data, MAP_ID_USER);

如果您不喜欢让static变量浮动,您可能还记得,该类不必是匿名的,可用作类型标记,例如。

public final class MapIdUser extends GenericType<Map<EnterpriseId, List<EnterpriseUser>>> {
}
…

Map<EnterpriseId, List<EnterpriseUser>> usersByEnterprise
                                      = Json.readFile(data, new MapIdUser());

如上所述,只有在项目中多次出现特定类型时,这一切都有帮助。

尽管如此,并非所有希望都失去了,并且看到了更美好的未来。 Java 9应该解除对匿名类实例化的类型推断的限制。所以在Java 9中,你将能够写出:

Map<EnterpriseId, List<EnterpriseUser>> usersByEnterprise
                                      = Json.readFile(data, new GenericType<>() { } );

在当前快照中,这已经有效......