Java泛型:将对象o的类与<E>进行比较

Java泛型:将对象o的类与<E>进行比较

Java Generics: Comparing the class of Object o to

假设我有以下课程:

1
2
3
4
5
public class Test<E> {
    public boolean sameClassAs(Object o) {
        // TODO help!
    }
}

如何检查oE是同一类?

1
2
3
Test<String> test = new Test<String>();
test.sameClassAs("a string"); // returns true;
test.sameClassAs(4); // returns false;

由于无法覆盖超类,因此无法从(Object o)更改方法签名,因此不要选择我的方法签名。

我也宁愿不尝试尝试强制转换,然后在异常失败时捕获所产生的异常。


Test的实例不了解什么E在运行时。因此,您需要将Class传递给Test的构造函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Test<E> {
    private final Class<E> clazz;
    public Test(Class<E> clazz) {
        if (clazz == null) {
            throw new NullPointerException();
        }
        this.clazz = clazz;
    }
    // To make things easier on clients:
    public static < T > Test< T > create(Class< T > clazz) {
        return new Test< T >(clazz);
    }
    public boolean sameClassAs(Object o) {
        return o != null && o.getClass() == clazz;
    }
}

如果需要" instanceof"关系,请使用Class.isAssignableFrom而不是Class比较。注意,出于相同的原因,E将需要是非通用类型,Test需要Class对象。

有关Java API中的示例,请参见java.util.Collections.checkedSet及类似内容。


我一直使用的方法如下。这是一种痛苦并且有点丑陋,但是我还没有找到更好的选择。您必须在构造时传递类类型,因为在编译泛型时,类信息会丢失。

1
2
3
4
5
6
7
8
9
public class Test<E> {
    private Class<E> clazz;
    public Test(Class<E> clazz) {
       this.clazz = clazz;
    }
    public boolean sameClassAs(Object o) {
        return this.clazz.isInstance(o);
    }
}


我只能使它像这样工作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Test<E> {  

    private E e;  

    public void setE(E e) {  
        this.e = e;  
    }

    public boolean sameClassAs(Object o) {  

        return (o.getClass().equals(e.getClass()));  
    }

    public boolean sameClassAs2(Object o) {  
        return e.getClass().isInstance(o);  
    }
}

我只是想做同样的事情,我刚刚意识到的一个巧妙技巧就是可以尝试强制转换,如果强制转换失败,将抛出ClassCastException。您可以捕获该消息,然后执行任何操作。

因此您的sameClassAs方法应如下所示:

1
2
3
4
5
6
7
8
9
10
11
public boolean sameClassAs(Object o) {
    boolean same = false;
    try {
        E t = (E)o;
        same = true;
    } catch (ClassCastException e) {
        // same is false, nothing else to do
    } finally {
        return same;
    }
}


推荐阅读

    linux一般检查命令?

    linux一般检查命令?,网络,系统,检测,情况,工作,信息,命令,进程,时间,设备,lin

    检查硬件linux命令?

    检查硬件linux命令?,信息,系统,第一,数据,设备,检测,命令,情况,灵活,实时,如

    检查路由命令linux?

    检查路由命令linux?,网络,地址,系统,信息,工具,电脑,时间,通信,服务,命令,lin

    linux数据库检查命令?

    linux数据库检查命令?,服务,状态,地址,位置,系统,信息,命令,工作,情况,密码,

    linux分区检查命令是?

    linux分区检查命令是?,系统,设备,工具,管理,情况,信息,检测,分区,密码,单位,

    linux检查流量的命令?

    linux检查流量的命令?,工具,系统,实时,状态,网络,信息,数据,密码,地址,流量,l

    linux检查更新命令是?

    linux检查更新命令是?,工作,软件,地址,系统,信息,管理,命令,目录,最新,标准,l

    命令检查linux版本?

    命令检查linux版本?,系统,地址,信息,发行,名称,电脑,版本,连续,工具,周期,在L

    linux内存检查命令?

    linux内存检查命令?,情况,系统,信息,工具,实时,分析,状态,内存,命令,总量,查

    linux下节点检查命令?

    linux下节点检查命令?,系统,信息,工作,名称,命令,地址,情况,文件,服务,第一,l

    python之执行对象

    python之执行对象,代码,数据,信息,概念,培训,通用,对象,属性,方法,赋值,有时

    Python 中的一切皆对象

    Python 中的一切皆对象,代码,数字,包装,培训,对象,函数,赋值,血统,字符串,

    Python类和对象

    Python类和对象,代码,培训,对象,实例,定义,关键字,函数,问题,顶层,全名,刚接

    Python中的对象

    Python中的对象,数据,连续,代码,培训,概念,对象,内存,类型,初始化,静态,Pyth