标签:int 还需要 push code 代码 return stat utils new
当我们需要创建一个类,其中的参数类型,需要后期给定的时候,就需要重新更改类型,再次创建,如下:
public class List {
private int[] items = new int[10];
private int count;
public void push(int item){
items[count++] = item;
}
public int get(int index) {
return items[index];
}
}
当我们这里想要一个UserList的时候,需要将元素的类型改为User,这样还需要重复创建结构一样的类,显然有些冗余,那么如何解决这个问题,一个很poor的方法,就是声明类型时,把元素类型定为Object,这样可以传入所有类型的变量。
public static void main(String[] args) {
var objectList = new ObjectList();
objectList.push(1);
objectList.push("123");
objectList.push(new User());
int first = (int) objectList.get(1);
// System.out.println(objectList.get(2));
}
但是在使用变量的时候,如果需要根据类型选择,在编写代码上会较为复杂。
下面使用泛型定义
public class GenericList<T> {
private T[] items = (T[]) new Object[10];
private int count;
public void push(T item){
items[count++] = item;
}
public T get(int index) {
return items[index];
}
}
之后在main中创建调用。
public class Main {
public static void main(String[] args) {
var list = new GenericList<Integer>();
list.push(1); //boxing
list.get(0); //unboxing
}
}
可以看到T赋值为了包装类Integer,但是传入参数的时候,是一个int类型的原始变量,这里编译器会默认调用包装类,进行包装,当获取这个元素的时候,会进行解包。
可以不将类声明为泛型,只将其中的函数声明为泛型函数,如下面的工具类中的函数:
public class Utils {
// 在工具类方法中,常声明为static,这样就不用实例化了
public static int max(int first, int second) {
return (first > second) ? first : second;
}
}
public class Utils {
// 在工具类方法中,常声明为static,这样就不用实例化了
public static <T extends Comparable<T>> T max(T first, T second) {
return (first.compareTo(second)>0) ? first : second;
}
}
这里需要将参数类型写做
T
,将返回值类型写作T
,并注意,要加入泛型声明<T>
,为了比较两个对象,这个泛型需要继承Comparable接口,并将接口的泛型设置为T
,之后函数体内可以调用参数为T
类型的compareTo函数。
标签:int 还需要 push code 代码 return stat utils new
原文地址:https://www.cnblogs.com/modai/p/12776354.html