public class GenericTest {
public static void main(String[] args) {
List list = new ArrayList();
list.add("zhangsan");
list.add("lisi");
//list.add(100); // 1 提示编译错误
for (int i = 0; i < list.size(); i++) {
String name = list.get(i); // 2 这里不用再进行类型转换了
System.out.println("name:" + name);
}
}
}
public class ArrayList extends AbstractList
implements List, RandomAccess, Cloneable, java.io.Serializable
{
transient Object[] elementData;
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
public E get(int index) {
rangeCheck(index);
return elementData(index);
}
.....
}
泛型其实只是在编译阶段有效的,看下面的代码:
List stringArrayList = new ArrayList();
List integerArrayList = new ArrayList();
Class classStringArrayList = stringArrayList.getClass();
Class classIntegerArrayList = integerArrayList.getClass();
if(classStringArrayList.equals(classIntegerArrayList)){
Log.d("泛型测试","类型相同");
}
class 类名称 <泛型标识:可以随便写任意标识号,标识指定的泛型的类型>{
private 泛型标识 /*(成员变量类型)*/ var;
.....
}
}
class People{
private T loveToEat;
public People(T loveToEat){
this.loveToEat = loveToEat;
}
public void setLoveToEat(T loveToEat) {
this.loveToEat = loveToEat;
}
public T getLoveToEat(){
return this.loveToEat;
}
}
public class test {
public static void main(String[] args) {
People liming = new People("字符串");
People zhangsan = new People(123);
System.out.println(liming.getLoveToEat().getClass().getName());
System.out.println(zhangsan.getLoveToEat().getClass().getName());
}
}
输出是:
java.lang.String java.lang.Integer
泛型定义中的上限
//用extends指定上限,这里extends后面既可以跟class也可以跟interface
class Box{
private T data;
public Box(T data){
this.data = data;
}
public T getData() {
return data;
}
}
public class test {
public static void main(String[] args) {
//Box name = new Box("zhangsan"); String不是继承自Number,报错
Box age = new Box(88);
Box number = new Box(123);
//Box
public static int func(List list, Map map) { ... }
其中T和S是泛型类型参数
类型参数也是有作用域的:
class A { ... },这里的T的作用域是整个A。 但这里要注意,对于A中静态区域和静态方法,是不能使用这个类型T的
public func(...) { ... },这里T的作用域是整个func
也存在作用域覆盖,内部会覆盖外部
class A {
// A已经是一个泛型类,其类型参数是T
public static void func(T t) {
// 再在其中定义一个泛型方法,该方法的类型参数也是T
}
}
//当上述两个类型参数冲突时,在方法中,方法的T会覆盖类的T,即和普通变量的作用域一样,内部覆盖外部,外部的同名变量是不可见的。
//除非是一些特殊需求,一定要将局部类型参数和外部类型参数区分开来,避免发生不必要的错误,因此一般正确的定义方式是这样的:
class A {
public static void func(S s) {
}
}
class Box{
private T data;
public Box(T data){
this.data = data;
}
public T getData() {
return data;
}
}
public class test {
//不使用通配符
public static void showData1(Box box){
System.out.println("data:" + box.getData());
}
//使用通配符,此处Box> box,?代表的是类型实参,Box>是所有Box的父类
public static void showData2(Box> box){
System.out.println("data:" + box.getData());
}
//使用?实参,代表没有限制。但有时我们需要限制
//通配符上限,就是实参类型必须是继承自某个类,或者就是那个类本身
public static void showData3(Box extends Number> box){
System.out.println("data:" + box.getData());
}
//通配符下限,就是实参类型必须是某个类的父类(或父类的父类等),或者就是那个类本身
public static void showData4(Box super Integer> box){
System.out.println("data:" + box.getData());
}
public static void main(String[] args) {
Box name = new Box("zhangsan");
Box age = new Box(88);
Box number = new Box(123);
Box obj = new Box(123);
//可以看出来,Box和Box是不兼容的,虽然Integer继承了Number
showData1(number);
//showData1(age); //The method getData(Box) in the t ype test is not applicable for the arguments (Box)
//使用?通配符,这个3个都可以正常调用
showData2(number);
showData2(age);
showData2(name);
//使用通配符上限,这2个都可以正常调用
showData3(number);
showData3(age);
//showData3(name); 不可用,因为String不是继承自Number
//使用通配符下限,这3个都可以正常调用
showData4(number);
showData4(age);
//showData4(name); 不属于Integer继承树中的一员
showData4(obj);
}
}
需要注意的是,使用了?通配符后,对象变成只读的(如果尝试写操作,编译无法通过了):
class Box{
private T data;
private String name;
public Box(T data){
this.data = data;
}
public T getData() {
return data;
}
}
public class test {
static void showInfo(Box> box){
//box是只读的,因为?代表的是什么是不确定的
//所以下面的修改操作会报错:Error:(33, 21) java: 不兼容的类型: int无法转换为capture#1, 共 ?
//box.setData(123);
System.out.println("" + box.getData());
}
public static void main(String[] args) {
Box age = new Box(88);
Box number = new Box(123);
showInfo(age);
}
}
如果希望workflow存储最近20次的log,在session里的Config Object设置,log options做配置,save session log :sessions run ;savesessio log for these runs:20
session下面的source 里面有个tracing 
今天遇到一个客户BUG,当前的jdbc连接用户是root,然后部分删除操作都会报下面这个错误:The user specified as a definer ('aaa'@'localhost') does not exist
最后找原因发现删除操作做了触发器,而触发器里面有这样一句
/*!50017 DEFINER = ''aaa@'localhost' */
原来最初
O7_DICTIONARY_ACCESSIBILITY参数控制对数据字典的访问.设置为true,如果用户被授予了如select any table等any table权限,用户即使不是dba或sysdba用户也可以访问数据字典.在9i及以上版本默认为false,8i及以前版本默认为true.如果设置为true就可能会带来安全上的一些问题.这也就为什么O7_DICTIONARY_ACCESSIBIL
#h1#
0、完成课堂例子
1、将一个四位数逆序打印
1234 ==> 4321
实现方法一:
# include <stdio.h>
int main(void)
{
int i = 1234;
int one = i%10;
int two = i / 10 % 10;
int three = i / 100 % 10;
===================================================================
第一个
===================================================================
try{
CString sql;
sql.Format("select * from p