使用泛型进行类型检查

Mig*_*ork 3 java generics

这是一个插图类:

class TypeChecker<T> {
    boolean isGood(Object something) {

        // won't compile
        return (something instanceof T);


        // maybe works, but oh so ugly!
        try {
            @SuppressWarnings("unchecked")
            T tmp = ((T) something);
        }catch(ClassCastException e) {
            return false;
        }
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

有什么好办法吗?

特定目的与示例略有不同,但想法是相同的 - 检查类型T(参数)的变量是否可以容纳某个对象.

Rad*_*def 10

使用Class#isInstance.

class TypeChecker<T> {
    private Class<T> ofType;

    TypeChecker(Class<T> ofType) {
        this.ofType = ofType;
    }

    boolean isGood(Object obj) {
        return ofType.isInstance(obj);
    }
}
Run Code Online (Sandbox Code Playgroud)

或者只是使用Class而不是在它周围创建一个包装器对象,如果你需要的只是isInstance检查.

没有其他方法可以动态执行运行时类型检查.你必须使用Class.

isInstance具有相同的语义instanceof(除了左侧和右侧被翻转)所以

"hello world" instanceof String
String.class.isInstance("hello world")
Run Code Online (Sandbox Code Playgroud)

两者都是真的.

此外,你的'也许工作'片段,没有不起作用.泛型被删除,因此未经检查的强制转换不会在运行时发生.这就是他们不受限制的原因.ClassCastException永远不会抛出.使用异常来确定逻辑流是不好的开始.