实现Hibernate消息插入器时发生Java泛型错误
框架:Spring,Hibernate。操作系统:Windows 我正试图按照这个方向实现hibernate的自定义消息插值器 当实现下面的类时,它给出了一个错误“不能对非静态类型的区域设置进行静态引用” } 执行以下操作可以吗实现Hibernate消息插入器时发生Java泛型错误,java,generics,Java,Generics,框架:Spring,Hibernate。操作系统:Windows 我正试图按照这个方向实现hibernate的自定义消息插值器 当实现下面的类时,它给出了一个错误“不能对非静态类型的区域设置进行静态引用” } 执行以下操作可以吗 将ClientLocaleThreadLocal中的静态方法/字段更改为非静态方法/字段 在TimeFilter中,通过如下实例化新对象来设置区域设置。 新建ClientLocaleThreadLocal().set(req.getLocale()) 提前谢谢你的帮助
public class ClientLocaleThreadLocal<Locale>
相比之下,ThreadLocal是泛型类型,其类型参数为所持有对象的类型。在您的情况下,这是语言环境
。因此,您的代码应为:
public class ClientLocaleThreadLocal {
private static ThreadLocal<Locale> tLocal = new ThreadLocal<Locale>();
public类ClientLocaleThreadLocal{
private static ThreadLocal tLocal=new ThreadLocal();
至于ThreadLocal是什么,请阅读它的Javadoc或谷歌名称
res.getLocale()
是否是“客户机区域设置”是我们无法知道的,因为“客户机区域设置”有点模糊。这里的“区域设置”是一个通用参数。这个特定的名称有点混乱,因为它与现有的类型名称冲突
按照惯例,泛型参数通常是单字母大写,如T、L、I等
您将收到的特定错误消息:
无法对非静态类型的区域设置进行静态引用
这是因为类级别的泛型参数只能在实例方法中使用,不能在静态方法中使用。请考虑一下。泛型参数通常在创建类的新实例时提供,但对于静态方法,永远不会有实例,因此无法引用实际泛型参数
例如,要使用您将使用的通用参数:
ClientLocaleThreadLocal<MyLocale> clt = new ClientLocaleThreadLocal<MyLocale>();
clt.set(someMyLocaleInstance);
如您所见,从未提供过泛型参数
因此,最初的JBoss示例并不完全正确。谢谢!Arjan的澄清。谢谢!非常感谢Meriton。这有助于我进一步说明这一点。只是为了澄清以下语句:“由于ClientLocaleThreadLocal始终包含区域设置,因此这里不需要类型参数。”您的意思是“始终包含ThreadLocal”?是的。im重要的一点是,您希望引用类java.util.Locale
,而不是声明名为Locale
的类型参数。
private static ThreadLocal tLocal = new ThreadLocal();
public class ClientLocaleThreadLocal {
private static ThreadLocal<Locale> tLocal = new ThreadLocal<Locale>();
ClientLocaleThreadLocal<MyLocale> clt = new ClientLocaleThreadLocal<MyLocale>();
clt.set(someMyLocaleInstance);
ClientLocaleThreadLocal.set(someMyLocaleInstance);