1

T がジェネリックであると仮定すると、このようなものを機能させる方法はありますか?

public T cast(int n){
 T toReturn = (T) n;
 return toReturn;
}
4

3 に答える 3

3

次のようにすることもできます。これは、常に 3 つの typeのいずれか、またはそのスーパータイプ、またはそのスーパータイプでT toReturn = (T)(Integer)n;ある限り、コンパイルされ、さらには実行されますが、おそらくあまり役​​に立ちません。TIntegerNumberObject

オブジェクトの型キャストは常に同じ参照を与えるため、オブジェクトが実際に持っている型にしかアクセスできません。an を作成しIntegerてから (たとえば) a にキャストすることはできません。これはDouble、 anIntegerが aDoubleではなく、オブジェクトの型キャストが新しいオブジェクトを作成しないためです。int から他の型のインスタンスを作成する場合は、その型のインスタンスを明確に作成できるメソッドを呼び出す必要があります。

于 2013-11-05T05:18:36.170 に答える
1

これは、あなたが望むものに私が考えることができる最も近いものです. あなたは次のようなインターフェースを持っているかもしれません

public interface ValueSettable{
    void setValue(int value);
}

そして、これを実装するクラスをたくさん持つことができます。

public class FunkyValue implements ValueSettable{
    private int value;
    public void setValue(int value){
        this.value = value;
    }
}

次に、このようなものを書くことができます。

public static <T implements ValueSettable> T cast(int value, Class<T> toInstantiate){
    T toReturn = toInstantiate.newInstance();
    toReturn.setValue(value);   
    return toReturn;
}

そしてそれを使うとき -

FunkyValue funky = cast(47, FunkyValue.class);
于 2013-11-05T05:17:24.527 に答える
1

intなどのプリミティブをオブジェクトに変換することはできません。あなたができる最善の方法は、たとえば、を にボックスint化することです。Integer

public Integer cast(int n){
    Integer toReturn = Integer.valueOf(n);
    return toReturn;
}
于 2013-11-05T05:08:28.790 に答える