ArrayList collection = new ArrayList();
collection.add(1);
collection.add(1L);
collection.add("abc");
int i = (Integer)arrayList(1);//编译时要强制类型转换且运行时出错。
ArrayList collection2 = new ArrayList();
collection2.add(1);
/*collection2.add(1L);
collection2.add("abv");//这2行代码编译时就报告了语法错误*/
int i2 = collection2.get(0);//不需要再进行类型转换
3.了解泛型(一些关于泛型的术语) ArrayList类定义和ArrayList类引用中涉及如下术语: a.整个称为ArrayList泛型类型 b.ArrayList中的E称为类型变量或类型参数 c.整个ArrayList称为参数化的类型,parameter。 d.ArrayList中的Integer称为类型参数的实例或实际类型参数 e.ArrayList中的<>念做typeof f.ArrayList称为原始类型 参数化类型与原始类型的兼容性: 1.参数化类型可以引用一个原始类型的对象,编译报告警告,例如:Collection c = new Vector(); 2.原始类型可以引用一个参数化类型的对象,编译报告警告,例如:Collection c = new Vector(); 参数化类型不考虑类型参数的继承关系: 1.Vector v = new Vector
泛型中的?通配符的扩展
限定通配符的上边界:
正确:Vector extends Number> x = new Vector();
错误:Vector extends Number> x = new Vector();
限定通配符的下边界:
正确:Vector super Integer> x = new Vector();
错误:Vector super Integer> x = new Vector();
提示:限定通配符总是包括自己。
5.自定义泛型方法及其应用
用于放置泛型的类型参数的尖括号应该出现在方法的其他所有修饰符之后,且在方法的返回类型之前,也就是紧邻返回值之前。按照惯例,类型参数通常用单个大写字母表示。
只有引用类型才能作为泛型方法的实际参数,swap(new int[3],3,5);语句会报告编译错误。
除了应用泛型时可以使用extends限定符,在定义泛型时也可以使用extends限定符,例如,Class.getAnnotation()方法的定义。并且可以用&来指定多个边界,如 void method(){}
普通方法,构造方法和静态方法中都可以使用泛型。编译器也不允许创建类型变量的数组。
也可以用类型变量表示异常,称为参数化的异常。可以用于方法的throws列表中,但是不能用于catch子句中。
在泛型中可以同时有多个类型参数,在定义它们的尖括号中用逗号分隔,例如:
public static V getValue(K key)
{return map.get(key);}
8.类型参数的类型推断
编译器判断泛型方法的实际类型参数的过程,称为类型推断,类型推断是相对于直觉推断的,其实现方法是一种非常复杂的过程。具体查阅文档。
根据调用泛型方法时,实际传递的参数类型或返回值的类型来推断,具体规则如下:
a.当某个类型变量只在整个参数列表中的所有参数和返回值中的一处被应用,那么根据调用方法时该处的实际应用类型来确定,这很容易凭着感觉推断出来,即可以直接根据调用方法时传递的参数类型或返回值来决定泛型参数的类型,例如:
swap(new String[3],3,4) --> static void swap(E[] a,int i,int j)
b.当某个类型变量在整个参数列表中的所有参数和返回值中的多处被应用了,如果调用方法时这多处的实际应用类型都对应同一种类型来确定,这很容易凭着感觉推断出来,例如: add(3,5) --> static T add(T a, T b)
c.当某个类型变量在整个参数列表中的所有参数和返回值中的多处被应用了,如果调用方法时这多处的实际应用类型对应到了不同的类型,且没有使用返回值,这时候取多个参数中的最大交集类型,例如,下面语句实际对应的类型就是Number了,编译没问题,只是运行时出问题:
fill(new Integer[3],3.5f) --> static void fill(T[] a, T v)
d.当某个类型变量在整个参数列表中的所有参数和返回值中的多处被应用了,如果调用方法时这多处的实际应用类型对应到了不同的类型, 并且使用返回值,这时候优先考虑返回值的类型,例如,下面语句实际对应的类型就是Integer了,编译将报告错误,将变量x的类型改为float,对比eclipse报告的错误提示,接着再将变量x类型改为Number,则没有了错误:
int x =(3,3.5f) --> static T add(T a, T b)
e.参数类型的类型推断具有传递性,下面第一种情况推断实际参数类型为Object,编译没有问题,而第二种情况则根据参数化的Vector类实例将类型变量直接确定为String类型,编译将出现问题:
copy(new Integer[5],new String[5]) --> static void copy(T[] a,T[] b);
copy(new Vector(), new Integer[5]) --> static void copy(Collection a , T[] b);
9.自定义泛型类的应用 DAO == data access object --》crud 定义泛型类型 如果类的实例对象中的多处都要用到同一个泛型参数,即这些地方引用的泛型类型要保持同一个实际类型时,这时候就要采用泛型类型的方式进行定义,也就是类级别的泛型,语法格式如下: public class GenericDao { private T field1; public void save(T obj){} public T getById(int id){} } 类级别的泛型是根据引用该类名时指定的类型信息来参数化类型变量的,例如,如下两种方式都可以: GenericDao dao = null; new genericDao(); 注意: 在对泛型类型进行参数化时,类型参数的实例必须是引用类型,不能是基本类型。 当一个变量被声明为泛型时,只能被实例变量、方法和内部类调用,而不能被静态变量和静态方法调用。因为静态成员是被所有参数化的类所共享的,所以静态成员不应该有类级别的类型参数。 类中只有一个方法需要使用泛型,使用方法级别的泛型。
package cn.itcast.day2;
import java.util.Set;
//dao data access object--->crud
public class GenericDao {
public void add(E x){
}
public E findById(int id){
return null;
}
public void delete(E obj){
}
public void delete(int id){
}
public void update(E obj){
}
public static void update2(E obj){
}
public E findByUserName(String name){
return null;
}
public Set findByConditions(String where){
return null;
}
}
CMS概述
并发标记清理垃圾回收(Concurrent Mark and Sweep GC)算法的主要目标是在GC过程中,减少暂停用户线程的次数以及在不得不暂停用户线程的请夸功能,尽可能短的暂停用户线程的时间。这对于交互式应用,比如web应用来说,是非常重要的。
CMS垃圾回收针对新生代和老年代采用不同的策略。相比同吞吐量垃圾回收,它要复杂的多。吞吐量垃圾回收在执
1,找到配置文件
vi /etc/sysconfig/iptables
2,添加端口开放,增加一行,开放18081端口
-A INPUT -m state --state NEW -m tcp -p tcp --dport 18081 -j ACCEPT
3,保存
ESC
:wq!
4,重启服务
service iptables
使用Android SDK Manager 更新了Anadroid SDK Tooks 之后,
打开eclipse提示 This Android SDK requires Android Developer Toolkit version 23.0.0 or above, 点击Check for Updates
检测一会后提示 No update were found