import java.util.TreeSet;
public class TreeSetDemo {
public static void main(String[] args) {
TreeSet<Integer> ts=new TreeSet<Integer>();
ts.add(10);
ts.add(40);
ts.add(30);
ts.add(20);
ts.add(50);
ts.add(30);
for (Integer i:ts){
System.out.println(i);
}
}
}
执行结果:
10
20
30
40
50
泛型的好处:
public class GenericDemo {
public static void main(String[] args) {
Collection c=new ArrayList();
c.add(11);
c.add("hello");
c.add("world");
Iterator it=c.iterator();
while (it.hasNext()){
String s=(String)it.next();
System.out.println(s);
}
}
}
执行结果:
Exception in thread "main" java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.String (java.lang.Integer and java.lang.String are in module java.base of loader 'bootstrap')
at General.GenericDemo.main(GenericDemo.java:16)
原因是这个集合中既有11(integer类型)又有“hello”(String类型),那么在 String s=(String)it.next();这一步中就会报错。
而如果使用泛型:
就会在执行之前,编译器中就报错,相当于是设定了这个集合collection中只能存储String类型,存别的类型就会报错。并且在后面也不需要强制类型转换了。
泛型类使用的好处
使用泛型类改进之后,代码量就大大减少了,传入的参数是什么类型打印的结果就是什么类型。
如:
public class GenericDemo02 {
public static void main(String[] args) {
// Generic02 g=new Generic02();
// g.show("林青霞");
// g.show(11);
// g.show(true);
// Generic02<String> g1=new Generic02<String>();
// g1.show("张柏芝");
Generic02 g=new Generic02() ;
g.show("林青霞");
g.show(30);
g.show(true);
}
}
执行结果:
林青霞
30
true
例如:
相当于就是把接口弄成了泛型的一种接口,使得实现这个接口的实现类也必须要继承/重写这个泛型和泛型方法。
可变参数
如果要实现求sum中有5,6,7…n个参数的话,那么肯定不能写完n种参数的sum函数。这里就可以使用可变参数。
public class ArgsDemo {
public static void main(String[] args) {
sum(1,2,4,5,56,3,2);
}
public static int sum(int ...a){
System.out.println(a);
return 0;
}
}
执行结果:
[I@43a25848
由执行结果中的"["看出,这个a实际上是一个数组,里面存储的是传进去的参数。
package Args;
public class ArgsDemo {
public static void main(String[] args) {
System.out.println(sum(1,2,4,5,56,3,2));
}
public static int sum(int ...a){
// System.out.println(a);
// return 0;
int sum=0;
for (int i:a){
sum+=i;
}
return sum;
}
}
执行结果:
73
还有一点需要注意的是,如果方法的参数既有可变参数又有固定参数,那么可变参数必须放到最后否则会报错。