如何在没有反射的情况下确定java中泛型属性的类类型?

Cli*_*ote 2 java generics

我有以下课程:

public final class Param<T>
{
    private final String name;
    private T value;
    public Param(String name)
    {
        this.name = name;
    }   

    public void setValue(T value) { this.value = value;}
    public T getValue() { return value; }
}
Run Code Online (Sandbox Code Playgroud)

我会用以下方式实例化它:

Param<Long> foo = new Param<>("bar");
Param<String> baz = new Param<>("foo");
Run Code Online (Sandbox Code Playgroud)

我想向public boolean validate(String value)此类添加一个方法,该方法将执行以下操作:

public boolean validate(String value)
{
    try
    {
        if (this.value instanceof String)
            return true;

        if (this.value instanceof Long)
            this.value = (T) Long.valueOf(value);
        else if (this.value instanceof Integer)
            this.value = (T) Integer.valueOf(value);
        //Snip.. a few more such conditions for Double, Float, and Booleans
        return true;
    }
    catch (NumberFormatException e)
    {
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,上述方法是否有效,以正确确定“类型”T并正确转换string valueT value?或者我应该使用不同的方法来验证参数?

Dan*_*iel 5

Java 泛型类型没有具体化,这意味着如果您需要有关它们的运行时信息,您需要有一些其他机制来跟踪它们。

一种常见的方法是Class<? extends T>在构造函数中传入一个令牌:

public final class Param<T>
{
    private final String name;
    private T value;
    private Class<? extends T> type;
    public Param(String name, Class<? extends T> type)
    {
        this.name = name;
        this.type = type;
    }

    public boolean isString() {
        return String.class.isAssignableFrom(type);
    } 
}
Run Code Online (Sandbox Code Playgroud)

  • 你是一个C-sharpie,对吧?它是 Java 中的 `boolean` :) (2认同)