首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java: Instanceof和Generics

Java: Instanceof和Generics
EN

Stack Overflow用户
提问于 2009-10-15 03:00:03
回答 9查看 214K关注 0票数 162

在查看一个值的索引的通用数据结构之前,我想看看它是否是this类型的实例。

但是Eclipse抱怨我这样做:

代码语言:javascript
复制
@Override
public int indexOf(Object arg0) {
    if (!(arg0 instanceof E)) {
        return -1;
    }

这是错误消息:

无法对类型参数执行实例检查。请使用它的擦除对象,因为泛型类型信息将在运行时被擦除

有什么更好的方法去做呢?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2009-10-15 03:10:39

错误信息说明了一切。在运行时,类型消失了,因此无法检查它。

您可以通过为对象创建一个工厂来捕获它,如下所示:

代码语言:javascript
复制
public static <T> MyObject<T> createMyObject(Class<T> type) {
    return new MyObject<T>(type);
}

然后在对象的构造函数中存储该类型,这样可以使您的方法看起来如下所示:

代码语言:javascript
复制
if (arg0 != null && !(this.type.isAssignableFrom(arg0.getClass())) {
    return -1;
}
票数 88
EN

Stack Overflow用户

发布于 2013-06-12 17:53:18

两种使用泛型进行运行时类型检查的选项:

选项1-损坏构造函数

让我们假设您正在重写indexOf(.),并且您只想检查类型的性能,以节省迭代整个集合的时间。

创建这样一个肮脏的构造函数:

代码语言:javascript
复制
public MyCollection<T>(Class<T> t) {

    this.t = t;
}

然后可以使用isAssignableFrom检查类型。

代码语言:javascript
复制
public int indexOf(Object o) {

    if (
        o != null &&

        !t.isAssignableFrom(o.getClass())

    ) return -1;

//...

每次实例化对象时,都必须重复:

代码语言:javascript
复制
new MyCollection<Apples>(Apples.class);

你可能会觉得这不值得。在ArrayList.indexOf(.)的实现中,它们不检查类型是否匹配。

选项2-让它失败

如果您需要使用一个需要未知类型的抽象方法,那么您真正想要的就是编译器不要再为实例而哭泣了。如果您有这样的方法:

代码语言:javascript
复制
protected abstract void abstractMethod(T element);

你可以这样使用它:

代码语言:javascript
复制
public int indexOf(Object o) {

    try {

        abstractMethod((T) o);

    } catch (ClassCastException e) {

//...

您将对象转换为T(泛型类型),只是为了欺骗编译器。您的演员在运行时什么也不做。,但是当您试图将错误类型的对象传递到抽象方法时,仍然会得到一个ClassCastException。

注1:如果您在抽象方法中执行其他未选中的强制转换,您的ClassCastExceptions将在这里被捕获。这可能是好的也可能是坏的,所以好好想想。

注2:当您使用instanceof时,将得到一个免费的空检查。。因为您不能使用它,所以您可能需要徒手检查它是否为空。

票数 48
EN

Stack Overflow用户

发布于 2015-02-18 10:04:33

旧的帖子,但是一种简单的方法来做一般的instanceOf检查。

代码语言:javascript
复制
public static <T> boolean isInstanceOf(Class<T> clazz, Class<T> targetClass) {
    return clazz.isInstance(targetClass);
}
票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1570073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档