Java泛型类型比较
Java generic type comparison
我想知道这样的东西在Java(C++和Java的混合)中是否可行
template<typename T> bool compare(Wrapper wrapper) {
if(wrapper.obj.getClass().equals(T.class))
return true
return false
}
为了澄清,该函数接收了一个包含java.lang.object的对象,但我希望能够将该包装器传递到该通用比较函数中,以检查该对象是否属于特定类型,即
if(compare<String>(myWrapper))
// do x
不,由于擦除,这是不可能的。基本上,compare
方法不知道T
是什么。只有一个compare
方法(与C++相反,C++中每个T
有一个),并且没有给出任何关于它是如何被调用的信息(即调用方认为它的T
是什么)。
典型的解决方案是让类(或方法)接受Class<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)) {
...
}
当然,这意味着呼叫站点需要具有Class<T>
对象。如果该调用站点本身是一个通用方法,则它需要从调用方获取引用,依此类推。在某个时刻,someone需要知道特定类型是什么,并且某人传入Foo.class
。
不能引用类型参数的静态成员(例如尝试以T.class
的形式引用)。在instanceof
表达式中也不能有意义地使用它们。更普遍地说,因为Java泛型是通过类型擦除实现的,所以在运行时不能以任何方式使用类型参数——所有类型分析都是在编译时静态执行的。
根据你追求的目标,至少有两种替代方法。
第一个,也是更常见的,是确保可以静态地检查必要的类型。例如,您可以使用Wrapper
类包装的对象的类型来参数化它。然后,假设您在类型安全的程序中使用它,那么无论您在哪里有Wrapper<String>
,您都知道包装的对象是String
。
但是,如果您想验证包装对象的特定类,当要测试的类不是final
时,这就不太好用了。在这种情况下,您可以传递Class
对象,类似于以下内容:
<T> boolean compare(Wrapper<? super T> wrapper, Class<T> clazz) {
return wrapper.obj.getClass().equals(clazz);
}
这将根据指定的类检查包装对象的类,只允许在静态分析允许返回true
的情况下调用该方法。
如果您愿意,您实际上可以将这两种方法结合起来,创建一个Wrapper
类,其实例只能包含特定类的成员,而不是可分配给给定类型的任何对象。不过,我不知道你为什么要这么做。
- 使用泛型类型推送到堆栈时出现问题
- 如何在容器中指定模板化别名的泛型类型
- 具有模板专用化的泛型类型转换
- C++存储泛型 T 类型类的向量
- 如何在C++中返回没有模板的泛型类型?
- 如何在带有约束 (C++) 的函数中使用泛型类型
- 模板函数重载(泛型类型与模板模板类型)选择正确的重载
- 泛型类型别名,它们彼此不兼容
- 泛型类型转换
- 重载泛型类型的模板类时检查运算符=时的自赋值
- 在C++中,如何根据类中的参数返回不同的泛型类型
- C++错误 C2227:'->looseHealth'左侧必须指向类/结构/联合/泛型类型
- 使用泛型类型显式实例化函数模板
- 函数模板中的无效转换错误,返回值取决于其泛型类型
- 如何确保 "<<" 运算符适用于模板化 ADT 定义中的任何泛型类型?
- 仅当泛型类型的值是指针时,才删除该值
- 错误c++visual studio c2227左侧'->;Init';必须指向类/结构/联合/泛型类型
- 有没有一种方法可以在c++中比较泛型类型(模板)和具体类型
- Java泛型类型比较
- 如何比较c++中的两个泛型类型?