变量不能是泛型的。
private <T> T var;
不可能 - 在哪一点被T
定义?访问时var
,我无法对分配时使用的内容做出太多假设。
Java 允许在类和方法上使用泛型。所以你可以拥有
private <T implements Cloneable & Serializable> void setVar(T val);
你可以有一个类范围的类型T
。
但请始终记住,它最终是通过类型擦除实现的。您始终可以使用 getter、setter 和 cast 来模拟更复杂的逻辑。如果做得好,它会给你同样多的类型安全。
获得具有所需类型安全性的变量的最简单方法是仅使用两个变量和一个 setter 来使它们保持同步。
private Serializable vars;
private Cloneable vars;
当然会给你一个很好的类型安全。但是,是的,它需要 4 个字节的额外内存和一个 setter。
这是您询问的铸造方法:
private Object internal_var;
// Implementation notice: do not remove this generic.
// Due to a Java limitation, we *do* want these two constraints!
public <T extends Serializable & Cloneable> void setVar(T val) {
internal_var = val;
}
public Serializable getSerializable() {
return (Serializable) internal_var; // Type checked in setter!
}
public Cloneable getCloneable() {
return (Cloneable) internal_var; // Type checked in setter!
}
// This is the way to use it in a generic getter:
public <T extends Serializable & Cloneable> T getVar(Class<? super T> cls) {
return (T) cls.cast(val);
}
请注意,为了T
在 getter 中使用,我们确实需要一个涉及 T 的参数。假设我们知道一个 class Example implements Serializable, Cloneable
,我们可以使用
// This actually ensures we get an instance of `Example` out:
Example e = instance.getVar(Example.class);