给定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<>();
答案 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<>() { } );
在当前快照中,这已经有效......