yanqiaoli
gaokang
2016-04-10 12:53
采纳率: 42.9%
浏览 2.3k
已采纳

关于java的匿名内部类和泛型

public class Counter {

private static ThreadLocal<Integer> counterContext = new ThreadLocal<Integer>(){
    protected synchronized Integer initialValue(){
        return 10;
    }
};

}

请教下上面这个类当中的这个匿名内部类起了什么作用,这个return 的10是传给了谁了呢?另外关于ThreadLocal中的这个泛型的用法不是很理解,我对泛型的理解仅仅是 ArrayList这类集合的泛型,说明里面只能存放String,对于ThreadLocal这种类的泛型又是什么意思呢?是ThreadLocal里面的某一个成员变量只能是Integer吗?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • wojiushiwo945you
    毕小宝 2016-04-10 13:05
    已采纳

    首先,这端代码本质上是定义了一个ThreadLocal变量,等价于:

     private static ThreadLocal<Integer> counterContext = new ThreadLocal<Integer>()
    

    这样的话它使用的就是ThreadLocal的默认的initialValue方法指定的值。
    其次,你这里的代码相等于实例化了一个ThreadLocal类型的匿名类,并重写了它的initialValue方法,这里的return 10并没有传给谁,而是整个方法声明需要返回一个初始化值。这个方法会在某个线程第一次调用get操作时返回。API的说明是这样的:

     Returns the current thread's "initial value" for this
         * thread-local variable.  This method will be invoked the first
         * time a thread accesses the variable with the {@link #get}
         * method,
    
    点赞 评论
  • caozhy

    这是一种技巧,counterContext因为是static类型的,所以jvm可以保证它只有一个实例。synchronized保证了initialValue是同步调用的,并且返回10。

    点赞 评论
  • pppploi8
    pppploi8 2016-04-10 13:17

    Orz这个匿名类感觉看不懂,所以我决定强行回答泛型的问题
    泛型是指你可以写出不关心类型的代码,在实际需要的时候往里面放置任何类型,比如说链表结构,我并不需要知道需要组成链表的集合是什么类型的,因为这不重要,但是我需要定义下一个节点的对象的类型是链表集合的类型,这时候就可以用泛型,先定义一个不确定的类型,直接使用这个类型来写代码。最终要用这个对象的时候通过 对象名<类型>来指定最终往泛型对象里传递什么类型,而不是一开始就在代码里写死
    那么里面只能放String这个理解似乎是有问题的...泛型本身应该是指可以存放任意类型
    至于ThreadLocal,百度找了个博文有具体解释:http://blog.csdn.net/lufeng20/article/details/24314381
    我不懂就不强答了,感觉似乎其他问题里面有解释

    点赞 评论

相关推荐