62,614
社区成员
发帖
与我相关
我的任务
分享
[quote=引用 8 楼 gentle_wolf 的回复:] [quote=引用 7 楼 sichenglain 的回复:] 泛型很简单啊,就是写的加个尖括号,写上你要添加进去的类型,让编译器验证就行了,
[quote=引用 7 楼 sichenglain 的回复:] 泛型很简单啊,就是写的加个尖括号,写上你要添加进去的类型,让编译器验证就行了,
当你把泛型用于快速排序、归并排序、堆排序、基数排序、自制ArrayList、自制LinkedList、自制HashMap、自制TreeSet的时候,你觉得你学到的算法得到了应用;当你把反射用于自制Hibernate、自制Spring、自制Struts2的时候,你觉得你学到的设计模式得到了运用。总之,Java中的泛型和反射这两个武器,就像C语言中的指针和动态分配内存一样强大。
[quote=引用 12 楼 gentle_wolf 的回复:] [quote=引用 11 楼 gentle_wolf 的回复:] [quote=引用 10 楼 raistlic 的回复:] 最重要的原因应该是 byte code 尽量向前兼容。 一直觉得 “真泛型” “假泛型” 是C程序员带有偏见的命名方式。 谁规定一个语言的泛型实现必须是运行时实现? 谁规定运行时携带类型信息就是所谓“真泛型”,否则就是所谓“假泛型”? Java 的泛型机制设计之初就是以编译为界限,如果你感觉到局限,那是你自己对泛型机制的定位有问题。 看过很多类似 "why java generics suck" 的文章,一般主要都是说,你在运行时无法取得泛型信息,blablabla…… 我想说的是: 你为什么要在运行时取得泛型信息? 你的设计有问题 / 你对Java泛型的定位有问题 / 你这时候如果要做类型检查,假如类型不符合,你除了抛出/处理运行时异常还能做什么?——你直接去cast就是了 / 就算给你拿到泛型信息,你又能用它们做什么?你要做的事,没有泛型真的不能做吗? 也有人无奈之下就拿效率来说事了,这没什么好争的,在效率方面,Java泛型利大于弊,编译时类型检查 > 运行时类型检查。 对于纠结自动装箱/拆箱效率问题的,我只想说: 用C++去吧,别用Java,真心的。
1.如果你理解了static在什么加载的,你就会发现,这个行不同是很正常 2.反射的时候,可以得到真的的泛型实例。(我在分页查询的时候,基类中就是使用泛型的方式,提供所有的DAO调用) 但是我也有很多不清楚的地方(泛型)。前来学习....
[quote=引用 9 楼 sichenglain 的回复:] [quote=引用 8 楼 gentle_wolf 的回复:] [quote=引用 7 楼 sichenglain 的回复:] 泛型很简单啊,就是写的加个尖括号,写上你要添加进去的类型,让编译器验证就行了,
public static <T extends Comparable<T>> Pair<T> minmax(T[] intAry) {
T min = intAry[0];
T max = min;
for (int i = 0; i < intAry.length; i++) {
if (min.compareTo(intAry[i]) > 0) {
min = intAry[i];
} else if (max.compareTo(intAry[i]) < 0) {
max = intAry[i];
}
}
return new Pair<T>(min, max);
}
但是不能定义泛型静态域,如下:
public static T getSingleton()
{
if(instance != null)
{
return instance;
}
return null;
}
private static T instance;
[/quote]我没说清楚,例如:
pulbic class A<T>{
private static T t;
public void static run(){
T t;
}
}
这样是不行的,运行时所有的实例都是共享静态的[quote=引用 8 楼 gentle_wolf 的回复:] [quote=引用 7 楼 sichenglain 的回复:] 泛型很简单啊,就是写的加个尖括号,写上你要添加进去的类型,让编译器验证就行了,
public static <T extends Comparable<T>> Pair<T> minmax(T[] intAry) {
T min = intAry[0];
T max = min;
for (int i = 0; i < intAry.length; i++) {
if (min.compareTo(intAry[i]) > 0) {
min = intAry[i];
} else if (max.compareTo(intAry[i]) < 0) {
max = intAry[i];
}
}
return new Pair<T>(min, max);
}
但是不能定义泛型静态域,如下:
public static T getSingleton()
{
if(instance != null)
{
return instance;
}
return null;
}
private static T instance;
为什么java编译器擦除了泛型,却还能在运行时通过Reflection API得到泛型类型信息?
[quote=引用 11 楼 gentle_wolf 的回复:] [quote=引用 10 楼 raistlic 的回复:] 最重要的原因应该是 byte code 尽量向前兼容。 一直觉得 “真泛型” “假泛型” 是C程序员带有偏见的命名方式。 谁规定一个语言的泛型实现必须是运行时实现? 谁规定运行时携带类型信息就是所谓“真泛型”,否则就是所谓“假泛型”? Java 的泛型机制设计之初就是以编译为界限,如果你感觉到局限,那是你自己对泛型机制的定位有问题。 看过很多类似 "why java generics suck" 的文章,一般主要都是说,你在运行时无法取得泛型信息,blablabla…… 我想说的是: 你为什么要在运行时取得泛型信息? 你的设计有问题 / 你对Java泛型的定位有问题 / 你这时候如果要做类型检查,假如类型不符合,你除了抛出/处理运行时异常还能做什么?——你直接去cast就是了 / 就算给你拿到泛型信息,你又能用它们做什么?你要做的事,没有泛型真的不能做吗? 也有人无奈之下就拿效率来说事了,这没什么好争的,在效率方面,Java泛型利大于弊,编译时类型检查 > 运行时类型检查。 对于纠结自动装箱/拆箱效率问题的,我只想说: 用C++去吧,别用Java,真心的。
[quote=引用 10 楼 raistlic 的回复:] 最重要的原因应该是 byte code 尽量向前兼容。 一直觉得 “真泛型” “假泛型” 是C程序员带有偏见的命名方式。 谁规定一个语言的泛型实现必须是运行时实现? 谁规定运行时携带类型信息就是所谓“真泛型”,否则就是所谓“假泛型”? Java 的泛型机制设计之初就是以编译为界限,如果你感觉到局限,那是你自己对泛型机制的定位有问题。 看过很多类似 "why java generics suck" 的文章,一般主要都是说,你在运行时无法取得泛型信息,blablabla…… 我想说的是: 你为什么要在运行时取得泛型信息? 你的设计有问题 / 你对Java泛型的定位有问题 / 你这时候如果要做类型检查,假如类型不符合,你除了抛出/处理运行时异常还能做什么?——你直接去cast就是了 / 就算给你拿到泛型信息,你又能用它们做什么?你要做的事,没有泛型真的不能做吗? 也有人无奈之下就拿效率来说事了,这没什么好争的,在效率方面,Java泛型利大于弊,编译时类型检查 > 运行时类型检查。 对于纠结自动装箱/拆箱效率问题的,我只想说: 用C++去吧,别用Java,真心的。
最重要的原因应该是 byte code 尽量向前兼容。 一直觉得 “真泛型” “假泛型” 是C程序员带有偏见的命名方式。 谁规定一个语言的泛型实现必须是运行时实现? 谁规定运行时携带类型信息就是所谓“真泛型”,否则就是所谓“假泛型”? Java 的泛型机制设计之初就是以编译为界限,如果你感觉到局限,那是你自己对泛型机制的定位有问题。 看过很多类似 "why java generics suck" 的文章,一般主要都是说,你在运行时无法取得泛型信息,blablabla…… 我想说的是: 你为什么要在运行时取得泛型信息? 你的设计有问题 / 你对Java泛型的定位有问题 / 你这时候如果要做类型检查,假如类型不符合,你除了抛出/处理运行时异常还能做什么?——你直接去cast就是了 / 就算给你拿到泛型信息,你又能用它们做什么?你要做的事,没有泛型真的不能做吗? 也有人无奈之下就拿效率来说事了,这没什么好争的,在效率方面,Java泛型利大于弊,编译时类型检查 > 运行时类型检查。 对于纠结自动装箱/拆箱效率问题的,我只想说: 用C++去吧,别用Java,真心的。
泛型很简单啊,就是写的加个尖括号,写上你要添加进去的类型,让编译器验证就行了,
[quote=引用 7 楼 sichenglain 的回复:] 泛型很简单啊,就是写的加个尖括号,写上你要添加进去的类型,让编译器验证就行了,