我现在已经潜伏了一段时间,但还没有找到答案。
有人在这里提到Class<T>
作为关键(我想),但我找不到帖子了。
无论如何,这个问题值得一个正确的答案(如果有一千个帖子帖子就道歉)。
Class<T>
是不可变的吗?是否可以安全有效地用作密钥(常量hashCode()
执行)?
我的猜测是肯定的,因为类定义在运行时不会改变。但我不太确定......谢谢!
编辑:谈论Java。答案 0 :(得分:2)
Java中的不可变对象是不能通过任何普通(非反射)执行路径更改其内部状态的对象。这意味着:
Java Class
类满足以下要求:
final
,不能分类。当然,实际的类定义由JVM通过类加载器加载,一旦定义,就会为该JVM的生命周期设置,并且不会更改。
答案 1 :(得分:2)
1)我不确定它是否可以称为不可变,至少在经典意义上,看一看
public final class Class<T>
...
native void setSigners(Object[] signers);
...
native void setProtectionDomain0(java.security.ProtectionDomain pd);
...
void setAnnotationType(AnnotationType type)
...
2)我们可以在HashMap中使用它,Class是一个单例,它的hashCode和equals基于它的标识,但需要注意的是一个类在不同的类加载器中会有不同的实例,所以来自classloader1的MyClass.class!= MyClass来自classloader2的.class
答案 2 :(得分:0)
hashCode()
的{{1}}方法未被覆盖,但JDK指定了有关Class
方法的以下内容:
getClass()
返回此Object的运行时类。 返回的Class对象是被表示的类的public final Class<?> getClass()
方法锁定的对象。
实际结果类型为static synchronized
,其中Class<? extends |X|>
是调用|X|
的表达式的静态类型的擦除。例如,此代码片段中不需要强制转换:
getClass
因此,对于任何实例Number n = 0;
Class<? extends Number> c = n.getClass();
,T obj
,T obj2
和obj.getClass()
都会返回相同的(不可变的)obj2.getClass()
对象。
但是,请注意类型擦除:对于Class<T>
或LinkedList<T> l1
,情况并非如此,因为两者都将返回类型擦除类LinkedList<U> l2
,而不是Class<LinkedList>
}具体针对Class<LinkedList<T>>
。
答案 3 :(得分:0)
是(假设类加载器是好的,因为在给定相同名称时,ir总是返回相同的Class
对象。)
hashCode
实例的Class
是其对象标识(Class
不重新定义hashcode
),它在对象的生命周期内保持不变。 JLS表示 one在其加载器可能可访问时不得卸载类或接口(为了避免重新加载类,这对应用程序来说是不透明的,因为Class
对象的对象标识会有所不同。
请注意,具有相同名称但由不同类加载器加载的类具有不同的哈希码。通常这应该不是问题,因为它们将是different run-time types,并且它们的实例不会与赋值兼容。