通用构造函数的好处

为非generics类设置generics构造函数有什么好处? Java规范允许以下内容:

class NonGeneric {  NonGeneric() { } ... NonGeneric ref = new  NonGeneric(); } 

能不能提出一个现实的例子来说明何时它可以增强class级的类型安全性? 它首先比使用Generic更好。

我知道Java设计者希望构造函数与方法更加一致。 鉴于构造函数可能有副作用,generics构造函数可以使用generics来改变一些不保留引用的参数,如

  NonGeneric(T obj, List list) { list.add(obj); // Don't hold a reference to list } 

我能想到的唯一用途是,如果构造函数在运行时需要使用generics对象,但一旦完成就不存储该对象。

例如:

  NonGeneric(T[] blank, List list) { // Sort that list T[] array = list.toArray(blank); Arrays.sort(array); // Pull out the values as strings this.list = new ArrayList(array.length); for (T value : array) { this.list.add(value.toString()); } } 

它很可能只是语言设计者决定做的事情,以防有人想要它,因为没有理由阻止人们这样做。

是的我几次都在考虑这个问题。

假设(有xx原因,为什么它不是这样的)如果Generic构造函数可以为整个类定义正式generics类型(如generics类声明那样)会很好……也就是说,如果定义Generic构造函数会让你在那个class级有通用字段……

例如,如果您想避免泛化:

 EntityRequestCallback extends RequestCallback 

但是你希望RequestCallback是通用的RequestCallback ,你不能这样做,因为只有两种类型的请求PUT / POST使用Entity。 只有PUT / POST请求的构造函数包含Entity参数。

 public class RequestCallback { /** GET/DELETE requests */ public RequestCallback(String gttUrl, HttpMethod method,) { this.gttUrl = gttUrl; this.method = method; } /** PUT/POST requests */ public RequestCallback(String gttUrl, HttpMethod method, Entity entity) { this.gttUrl = gttUrl; this.method = method; this.entity = entity; } } 

但是这个类不能是通用的,因为你会为没有实体的Request创建RequestCallback,这意味着你会实例化

 new RequestCallback(); //without specifying generic parameter - worse than nothing 

所以这里唯一可行的方法是概括:

 EntityRequestCallback extends RequestCallback 

这样你就可以拥有通用字段:

 public E entity; 

在这个特定的例子中,无论如何,泛化是正确的选择,但有些情况下不会进行泛化。