使用泛型进行类型检查

时间:2014-03-29 16:05:04

标签: 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;
    }
}

有没有好办法呢?

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

1 个答案:

答案 0 :(得分: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);
    }
}

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

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

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

"hello world" instanceof String
String.class.isInstance("hello world")

两者都是真的。

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