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 回答
0

我不确定这是否会对您有所帮助,但我过去曾使用它来反序列化和返回适当类型的对象。

public <T> T deserialize(String xml){
    T object=null;
    ...
    //pull type information from method param
    ...
    return object=(T)type.newInstance(); //helper to instantiate class
}

但是,我不完全确定您需要做什么。实现此目的的一种更简单、更简洁的方法可能是为您需要的给定类型创建一个 Converter 接口,并让任何需要使用它的类来实现它。然后,您需要的任何类型都可以直接在 Object 本身上调用。例如:

inerface Convertor<T>{

    T convert();

    void set(T value);

}





class Something implements Converter<Long,ByteArray>{

    ...

    public ByteArray convert(){...}

    public void set(ByteArray value){...}

}
于 2013-04-15T13:40:24.250 回答