0

我有一个泛型类型的类:

class Foo<T> {
    protected boolean validateType(Object obj){
        if (obj instanceof T) {
            return true;
        }
        return false;
    }

}

去测试:

Foo foo = new Foo<String>();
foo.validateType(new String()); // should return true
foo.validateType(new Long()); // should return false;

并且有一个需要针对泛型类型“T”验证对象的函数,显然上面的代码有错误?

我该怎么做

4

2 回答 2

2

就目前而言,您尝试做的事情是不可能的-泛型是通过擦除在Java中实现的,这意味着泛型参数在运行时不存在。编译器可以在那里进行类型检查,但在运行时无法区分 aFoo<String>和 a Foo<Long>

所以如果你想要一个特定的令牌来检查,你必须自己做。进行这种检查的一种常见模式是使用Class对象,其好处是这些可以由编译器进行类型检查:

class Foo<T> {
    private final Class<T> genericClass;

    public Foo(Class<T> clazz) {
        this.genericClass = clazz;
    }

    protected boolean validateType(Object obj){
        return genericClass.isInstance(obj);
    }
}

请注意,您的调用者现在需要自己传入Class对象;没有办法绕过这个要求,它不能由 Java 本身自动连接。

if (x) return true; else return false;(此外,当它与 完全相同return x;但更容易混淆和容易出错时使用它是一个坏主意。)

于 2012-06-29T09:28:36.997 回答
1

所以 Instance ofFoo没有关于T运行时是什么的信息。

因此,您必须将 a 传递Class<T>Foo.

private final Class<T> cl;

protected boolean validateType(Object ob){
    return cl.isInstance(ob);
}
...
于 2012-06-29T09:30:27.027 回答