java - 根据 gereric 'T' 类型验证对象实例类型

标签 java

我有一个具有泛型类型的类:

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”验证对象,显然上面的代码有错误?

我该怎么做

最佳答案

您想要做的事情目前是不可能的 - 泛型是由 erasure 在 Java 中实现的,这意味着泛型参数在运行时不存在。它可供编译器进行类型检查,但在运行时无法区分 Foo<String>Foo<Long> 之间的区别。

因此,如果您想要检查特定 token ,则必须自己执行此操作。进行此类检查的常见模式是使用 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; 完全相同但更容易混淆且容易出错时,使用 ojit_code 是一个坏主意。)

关于java - 根据 gereric 'T' 类型验证对象实例类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11259202/

相关文章:

java - 如何确定哪个接口(interface)属于每个网络目标 - Java?

java - kotlin 1.3 协程使用导致 ClassNotFoundException : kotlinx. coroutines.BuildersKt

java - 为什么我们不能从内部类构造函数访问另一个内部类?

java - POM 丢失,没有可用的依赖信息,未找到 cfg.xml

java - 从一个字符串中查找模式以应用于另一个字符串 - Java

java - 如何@SuppressWarnings : "Resource leak: ' client' is never closed"

java - 使用方法将数据添加到父类(super class)和数组

java - 如何使用 freemarker 将字符串转换为数字?

java - 正则表达式模式上 `java.lang.SecurityException: Prohibited package name` 的解决方法

java - ANTLR3 C 目标错误生成 TreeParser : ( ASTTreeParser. stg 321:25:匿名模板有 0 个参数但映射到 1 个值)