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

问题描述

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

解决方案

首先,这端代码本质上是定义了一个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,

解决方案二:

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

解决方案三:

java匿名内部类
java匿名内部类
JAVA中的匿名内部类

解决方案四:

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

时间: 2024-08-30 19:07:08

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

java的匿名内部类

至此,我们已基本理解了内部类的典型用途.对那些涉及内部类的代码,通常表达的都是"单纯"的内部类,非常简单,且极易理解.然而,内部类的设计非常全面,不可避免地会遇到它们的其他大量用法--假若我们在一个方法甚至一个任意的作用域内创建内部类.有两方面的原因促使我们这样做: (1) 正如前面展示的那样,我们准备实现某种形式的接口,使自己能创建和返回一个句柄. (2) 要解决一个复杂的问题,并希望创建一个类,用来辅助自己的程序方案.同时不愿意把它公开. 在下面这个例子里,将修改前面的代码,以便使

java中匿名内部类解读分析_java

这段时间在看android,看到了java里面的匿名内部类,在印象当中.net里面不支持匿名内部类. 匿名类是不能有名称的类,所以没办法引用它们.必须在创建时,作为new语句的一部分来声明它们.这就要采用另一种形式的new语句,如下所示: new <类或接口> <类的主体> 这种形式的new语句声明一个新的匿名类,它对一个给定的类进行扩展,或者实现一个给定的接口.它还创建那个类的一个新实例,并把它作为语句的结果而返回.要扩展的类和要实现的接口是new语句的操作数,后跟匿名类的主体.

Java集合框架和泛型机制

1.容器类 JDK API中专门设计用来存储其他对象的类,一般称为对象容器类,简称容器类,这组类和接口的设计结构也被统称为集合框架(Collection Framework).集合框架中容器类的关系如下图示 主要从两方面来选择容器: (1)存放要求 无序:Set,不能重复 有序:List,允许重复 "key-value"对:Map (2)读写数据效率 Hash:两者都最高. Array:读快改慢. Linked:读慢改快. Tree:加入元素可排序使用. 2.泛型 应用背景:存入容器的

Java基础知识之泛型全接触

当我们在定义类,接口和方法时,可以接收一个类型作为参数,这就叫做泛型. 函数可以传入普通的参数,也可以传入一个类型参数.不同之处是普通的参数就是值而已,但是类型参数却是个类型. 使用泛型的好处: 强类型检查.在编译时就可以得到类型错误信息. 避免显式强制转换. 方便实现通用算法. 对类使用泛型 我们可以创建一个简单的Class Box.它提供存取一个类型为Object的对象. 1 2 3 4 5 6 7 8 9 10 public class Box { public Object getObj

Java:使用匿名内部类在方法内部定义并启动线程

下面的代码展示了在一个方法中,通过匿名内部类定义一个Thread,并Override它的run()方法,之后直接启动该线程. 这样的代码可用于在一个类内部通过另起线程来执行一个支线任务,一般这样的任务并不是该类的主要设计内容. package com.zj.concurrency; public class StartFromMethod { private Thread t; private int number; private int count = 1; public StartFrom

java中 gson与泛型的问题,求大神指点

问题描述 在gson里可以通过typetoken拿到泛型的实际类型,现在为了代码层面的干净,想做个简单的封装,遇到了点问题,请教大神们~我有一个带泛型类A<TextendsB>我希望能写一个函数,参数里把T的实际类型和对应的json字符串传过去,GSON能解析出来A.类似这样:publicclassB{publicintb;}publicclassA<TextendsB>{publicTa;}publicclassCextendsB{publicintc;}publicstatic

java学习笔记之泛型用法

泛型:jdk1.5版本以后出现的新特性,用于解决安全问题,是一个类安全机制. 好处:    1.将运行期间出现问题呢classCastException,转移到来了编译时期,方便程序员解决问题.让运行事情问题减少,安全.    2.避免出现强制转换麻烦. 泛型格式:通过<>来定义要操作的引用类型. 使用情况:  通常在定义框架中很常见,只要见到<>就要定义型,<>用来修饰类型.   当使用类型时,将集合中要存储的数据类型当做参数传递到<>即可. 泛型类:定义

java泛型【收藏】

什么是泛型? 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运行时传递的值的占位符一样. 可以在集合框架(Collection framework)中看到泛型的动机.例如,Map 类允许您向一个 Map 添加任意类的对象,即使最常见的情况是在给定映射(map)中保存某个特定类型(比如 String)的对象. 因为 Map.get(

Java泛型和通配符那点事

泛型(Generic type 或者generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运行时传递的值的占位符一样. 可以在集合框架(Collection framework)中看到泛型的动机.例如,Map类允许您向一个Map添加任意类的对象,即使最常见的情况是在给定映射(map)中保存某个特定类型(比如String)的对象. 因为Map.get()被定义为返回Object