Java泛型类型比较 我想知道在java中(C++和java的混合)是否有可能。 模板布尔比较(包装器){ if(wrapper.obj.getClass().equals(T.class)) 返回真值 返回错误 }

Java泛型类型比较 我想知道在java中(C++和java的混合)是否有可能。 模板布尔比较(包装器){ if(wrapper.obj.getClass().equals(T.class)) 返回真值 返回错误 },java,c++,generics,Java,C++,Generics,为了澄清这一点,该函数接收一个包含java.lang.object的对象,但我希望能够将该包装传递到这个通用比较函数中,以检查该对象是否属于特定类型,即 if(compare<String>(myWrapper)) // do x if(比较(myWrapper)) //多克斯 不,由于以下原因不可能。基本上,compare方法不知道T是什么。只有一个比较方法(与C++不同,这里有一个每个代码> t>代码>,并且没有给出它被调用的任何信息(即调用方认为它的代码< T >代码

为了澄清这一点,该函数接收一个包含java.lang.object的对象,但我希望能够将该包装传递到这个通用比较函数中,以检查该对象是否属于特定类型,即

if(compare<String>(myWrapper))
    // do x
if(比较(myWrapper))
//多克斯

不,由于以下原因不可能。基本上,
compare
方法不知道
T
是什么。只有一个<代码>比较方法(与C++不同,这里有一个每个代码> t>代码>,并且没有给出它被调用的任何信息(即调用方认为它的代码< T >代码>)。 典型的解决方案是让类(或方法)接受
类cls
,然后使用
cls。isInstance

public <T> boolean compare(Wrapper wrapper, Class<T> cls) {
    return cls.isInstance(wrapper.obj);
}

// and then, at the call site:
if (compare(wrapper, Foo.class)) {
    ...
}
公共布尔比较(包装器,类cls){
返回cls.isInstance(wrapper.obj);
}
//然后,在呼叫站点:
if(比较(包装器,Foo.class)){
...
}

当然,这意味着呼叫站点需要有
对象。如果调用站点本身是一个泛型方法,则需要从调用方获取该引用,依此类推。在某个时刻,有人需要知道具体的类型是什么,并且有人传入
Foo.class

不,这是不可能的,因为。基本上,
compare
方法不知道
T
是什么。只有一个<代码>比较方法(与C++不同,这里有一个每个代码> t>代码>,并且没有给出它被调用的任何信息(即调用方认为它的代码< T >代码>)。 典型的解决方案是让类(或方法)接受
类cls
,然后使用
cls。isInstance

public <T> boolean compare(Wrapper wrapper, Class<T> cls) {
    return cls.isInstance(wrapper.obj);
}

// and then, at the call site:
if (compare(wrapper, Foo.class)) {
    ...
}
公共布尔比较(包装器,类cls){
返回cls.isInstance(wrapper.obj);
}
//然后,在呼叫站点:
if(比较(包装器,Foo.class)){
...
}

当然,这意味着呼叫站点需要有
对象。如果调用站点本身是一个泛型方法,则需要从调用方获取该引用,依此类推。在某些情况下,有人需要知道具体的类型是什么,并且有人传入
Foo.class

您不能引用类型参数的静态成员(例如您尝试以
T.class
的形式)。在表达式的
实例中也不能有意义地使用它们。更一般地说,因为Java泛型是通过类型擦除实现的,所以在运行时不能以任何方式使用类型参数——所有类型分析都是在编译时静态执行的

根据您的具体目标,至少有两种替代方法

首先,也是更常见的,是确保可以静态地检查必要的类型。例如,您可以使用所包装的对象的类型参数化
包装器
类。然后,假设您在类型安全的程序中使用它,只要您有
包装器
,您就知道包装的对象是
字符串

但是,当要测试的类不是
final
时,如果要验证包装对象的特定类,那么这种方法就不太有效。在这种情况下,您可以传递一个
对象,如下所示:

<T> boolean compare(Wrapper<? super T> wrapper, Class<T> clazz) {
    return wrapper.obj.getClass().equals(clazz);
}

boolean compare(Wrapper您不能引用类型参数的静态成员(例如您尝试以
T.class
的形式)。您也不能在表达式的
实例中有意义地使用它们。更一般地说,因为Java泛型是通过类型擦除实现的,所以您不能在运行时以任何方式使用类型参数—所有类型分析都是在编译时静态执行的

根据您的具体目标,至少有两种替代方法

第一个,也是更常见的一个,是确保可以静态地检查必要的类型。例如,您可以使用它所包装的对象的类型参数化
包装器
类。然后,假设您在类型安全的程序中使用它,无论您在哪里有
包装器
,您都知道包装的对象是de>字符串

但是,如果要验证包装对象的特定类,那么当要测试的类不是
final
时,这就不太管用了。在这种情况下,您可以传递
class
对象,如下所示:

<T> boolean compare(Wrapper<? super T> wrapper, Class<T> clazz) {
    return wrapper.obj.getClass().equals(clazz);
}

boolean compare(wrapper)我明白了,这个解决方案应该适合我需要的东西,谢谢。这个方法是如何处理继承的呢?如果我有B:A,compare(B,A.class)会返回true吗?我明白了,那个解决方案应该适合我需要的东西,谢谢。这个方法是如何处理继承的呢(B,A.class)返回真值?