変数をジェネリックにすることはできません。
private <T> T var;
は不可能です - どの時点でT
定義されていますか? にアクセスするときvar
、割り当て時に何を使用したかについてあまり推測できません。
Java では、クラスおよびメソッドでジェネリックを使用できます。だからあなたが持つことができます
private <T implements Cloneable & Serializable> void setVar(T val);
クラス全体の type を持つことができますT
。
しかし、最終的には型 erase によって実装されることを常に覚えておいてください。ゲッター、セッター、キャストを使用して、より複雑なロジックをいつでもエミュレートできます。適切に行うと、型の安全性が同じになります。
必要な型安全性を持つ変数を取得する最も簡単な方法は、2 つの変数とセッターを使用してそれらを同期させることです。
private Serializable vars;
private Cloneable vars;
もちろん、優れた型安全性を提供します。ただし、4 バイトの追加メモリとセッターが必要です。
あなたが尋ねたキャスティングアプローチは次のとおりです。
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);