2 yanqiaoli yanqiaoli 于 2016.04.10 20:53 提问

关于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吗?

4个回答

wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.04.10 21: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
caozhy   Ds   Rxr 2016.04.10 20:57

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

CSDNXIAON
CSDNXIAON   2016.04.10 21:02

java匿名内部类
java匿名内部类
JAVA中的匿名内部类
----------------------同志你好,我是CSDN问答机器人小N,奉组织之命为你提供参考答案,编程尚未成功,同志仍需努力!

pppploi8
pppploi8   2016.04.10 21:17

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

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!