7

次のようなメソッドがあるとします。

static class Example 
{
    public static <N extends Number> Number getOddBits(N type)
    {
        if (type instanceof Byte) return (byte)0xAA;
        else if (type instanceof Short) return (short)0xAAAA;
        else if (type instanceof Integer) return 0xAAAAAAAA;
        else if (type instanceof Float) return Float.intBitsToFloat(0xAAAAAAAA);
        else if (type instanceof Long) return 0xAAAAAAAAAAAAAAAAL;
        else if (type instanceof Double) return Double.longBitsToDouble(0xAAAAAAAAAAAAAAAAL);
        throw new IllegalArgumentException();
    }
}

メソッドの実際の詳細はそれほど重要ではありません。ただし、このメソッドを呼び出すには、次を使用します。

Example.<Float>getOddBits(0f);

私の質問は、従来のパラメーターなしでそのようなメソッドを作成することは可能ですか? 過負荷なし、そして最終的にはボクシングなし。

理想的には次のように呼び出されます。

Example.<Byte>getOddBits();
4

3 に答える 3

7

取るのは.classどうですか?

public static Number getOddBits(Class<? extends Number> cls)
{
    if (cls == Byte.class) {
        return (byte)0xAA;
    } else if (cls == Short.class) {
        return (short)0xAAAA;
    } else if (cls == Integer.class) {
        return 0xAAAAAAAA;
    } else if (cls == Float.class) {
        return Float.intBitsToFloat(0xAAAAAAAA);
    } else if (cls == Long.class) {
        return 0xAAAAAAAAAAAAAAAAL;
    } else if (cls == Double.class) {
        return Double.longBitsToDouble(0xAAAAAAAAAAAAAAAAL);
    }
    throw new IllegalArgumentException();
}

...

Example.getOddBits(Float.class);
于 2013-04-15T10:24:36.660 に答える
1

KennyTM の提案の拡張として、 Class 引数をメソッドジェネリックと組み合わせて、特殊な型を返すことができます。

@SuppressWarnings("unchecked")
public static <N extends Number> N getOddBits(Class<N> cls) {
    Number out;
    if (cls == Byte.class) {
        out = (byte)0xAA;
    } else if (cls == Short.class) {
        out = (short)0xAAAA;
    } else if (cls == Integer.class) {
        out = 0xAAAAAAAA;
    } else if (cls == Float.class) {
        out = Float.intBitsToFloat(0xAAAAAAAA);
    } else if (cls == Long.class) {
        out = 0xAAAAAAAAAAAAAAAAL;
    } else if (cls == Double.class) {
        out = Double.longBitsToDouble(0xAAAAAAAAAAAAAAAAL);
    } else {
        throw new IllegalArgumentException();
    }
    return (N)out;
}

これにより、以下を割り当てることができ、各呼び出しでのキャストを回避できます。

    float result = Example.getOddBits(Float.class);
于 2013-04-15T12:18:30.937 に答える