实现Hibernate消息插入器时发生Java泛型错误

实现Hibernate消息插入器时发生Java泛型错误,java,generics,Java,Generics,框架:Spring,Hibernate。操作系统:Windows 我正试图按照这个方向实现hibernate的自定义消息插值器 当实现下面的类时,它给出了一个错误“不能对非静态类型的区域设置进行静态引用” } 执行以下操作可以吗 将ClientLocaleThreadLocal中的静态方法/字段更改为非静态方法/字段 在TimeFilter中,通过如下实例化新对象来设置区域设置。 新建ClientLocaleThreadLocal().set(req.getLocale()) 提前谢谢你的帮助

框架: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);