返回信息流一直不太明白Java中泛型的内部机制,现在碰到问题如下
Set<Integer> set = new HashSet<Integer>();
和
Set<Integer> set = new HashSet();
的区别是什么?
今天写一个题,用第一种形式能AC,第二句就TLE,不太明白
前一个<Integer>和后一个<Integer>分别起到什么作用
小白求助
这是一条镜像帖。来源:北邮人论坛 / java / #52766同步于 2016/9/5
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
Java中的尖括号使用
VictorLees
2016/9/5镜像同步13 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
建议读一下Thinking in Java中泛型的一章
虽然我也不明白为什么第二句会TLE。。。
【 在 VictorLees (SimVic) 的大作中提到: 】
: 一直不太明白Java中泛型的内部机制,现在碰到问题如下
: [code=java]
: Set<Integer> set = new HashSet<Integer>();
: ...................
尝试回答一下
[code]
import java.util.*;
/**
* new HashSet() 是实例化了一个类,没有加泛型的情况下,编译器只保证里面存的都是Object,所以你存String也好Integer也好
* Set<Integer> set 是变量,用泛型做了限定规定这个set里面只能是Integer的类型,所以赋值的过程中隐藏了一次强制的类型转换
* 所以楼主第二种写法因为实例化的过程中没有进行类型检查,所以编译器会提示未经安全检查(可能是出错原因?)
*另外由于根据Set<Integer> set一定可以推断出想要实例化的是存放Integer的set所以可以把后者的检查略去不谢,写成 Set<Integer> set = new HashSet<>() (菱形运算符仍需保留)
*/
public class problem {
public static void main(String[] args) {
Set set1 = new HashSet();
Set<Integer> set2 = new HashSet();
set2.add(2);
//set2.add("1"); //error cant not add this
set1.add(2);
set1.add("1");//可以通过但是有未经检查的提示
}
}
[/code]
嗯嗯,非常感谢!我理解到这个程度也足够了~[ema11]
【 在 flymop (喵小爱) 的大作中提到: 】
: 尝试回答一下
: [code]
: import java.util.*;
: ...................
java的泛型参数只在语言级有意义。对于jvm来说,所有的泛型参数都被擦出了,没有理由时间不一样的啊。
【 在 VictorLees 的大作中提到: 】
: 暖神是觉得这两种写法应该是一样的时间开销吗?。。