Java泛型专项练习

一、泛型的上下限

已经创建了一个 Info 的泛型类,用来存储数据。

在 Solution 类中实现方法 upperLimit() 和 lowerLimit() 的功能。

package step6;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.Arrays;
 
public class Solution {
    public Number upperLimit(Info<? extends Number>s){
        return s.get();
    }
 
    public Object lowerLimit(Info<? super String>s){
        return s.get();
    }
}
 

二、泛型的使用

编写了一个泛型类 Containers 用来存储数据:

样例一

当传入数据为 t = 100 时,Containers 获取到的值为: 100

样例二

当传入数据为 t = ac 时,Containers 获取到的值为: ac

package step7;

/***************请勿改动Container类代码*************/
class Containers<T> {

    private T t;

    public void set(T t){
        this.t = t;
    }

    public T get(){
        return t;
    }
}
/***************请勿改动Container类代码*************/

public class Solution<T> 
{

    public Containers<T> initContainers(T t)
	{
        // 请在下面的Begin...End间编写你的代码
        /*************Begin***************/
        //(1)声明Containers对象
		Containers<T> containers = new Containers<>();
		//(2)用形参初始化Containers对象
        containers.set(t);
        containers.get();
		//(3)返回Containers对象
        return containers;
        /**************End**************/
    }
}

三、泛型类的声明和使用

设计一个简单的泛型类 Solution,泛型类中包含一个变量 var ;方法 setVar 设置变量 var 的值; 方法 getVar 获取 var 的值。

package step8;

import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.util.*;

//请在下面的Begin...End间编写代码
/**************Begin**************/
//(1)声明泛型类
public class Solution<T> {
   //(2)声明泛型变量var
	private T var;
   //(3) 定义泛型方法setVar
	public void setVar(T var) {
      this.var= var; 

	}
   //(4)定义泛型方法getVar
   public T getVar() {
      return var;
   }
    
}
/**************Begin**************/

 

四、泛型数组

请在 Solution 类中定义一个非静态方法 copy(),用来把任意参数类型的一个数组中的数据安全地复制到相应类型的另一个数组中,并且不用指定方法的返回值。 Main类中调用copy()方法的格式如下:

Solution solution = new Solution();
solution.copy(a, b);//从源数组a复制到目标数组b

1、什么是泛型数组

泛型数组指的是数组的类型为泛型。示例代码如下:

T[] nums = new T[10];//声明一个泛型数组并动态初始化其大小为10

2、复制数组

复制数组就是:把源数组a(有值)中的元素全部复制到目标数组b(空值)中

方法一:使用for循环。

int[] arr = {1,3,5,7,9};
int[] brr = new int[arr.length];
for(int i = 0 ; i < arr.length; i++){
    brr[i] = arr[i];
}
//打印数组brr
for(int i = 0 ; i < brr.length; i++){
    System.out.print(brr[i] + " ");
}

方法二:使用Arrays工具类的copyOf或copyOfRange方法。

根据数组元素的类型,Arrays工具类提供了众多的静态方法copyOf、copyOfRange,用于把源数组a复制到目标数组b中。以int类型的数组和泛型数组为例,说明这些方法的声明和功能。

copyOf()方法示例代码如下:

int[] a = new int[]{5, 3, 2, 4, 1};
int[] b = Arrays.copyOf(a, a.length);
for (int i : b) {
   System.out.print(i + " ");
}

输出:5 3 2 4 1

copyOfRange()方法示例代码如下:

int[] a = new int[]{5, 3, 2, 4, 1};
int[] b = Arrays.copyOfRange(a, 0, a.length);
for (int x : b) {
   System.out.print(x + " ");
}

上述代码的第2行中,Arrays.copyOfRange(a, 0, a.length),由于a.length = 5, 因此复制范围是[0, 5),这是一个左闭右开的区间,实际的复制区间是[0,4],因为最后一个元素的索引是4。

输出:5 3 2 4 1

方法三:使用System类的静态arraycopy()方法。

public static void arraycopy(Object src,int srcPos, Object dest, int destPos,int length);

功能:将源数组src中从指定位置srcPos开始的元素复制到目标数组dest的指定位置destPos处。 length参数为复制的元素个数。 源数组src指针中从位置srcPos至srcPos+length-1的元素分别复制到目标数组dest的位置destPos至destPos+length-1。

比如:

int[] a = new int[]{5, 3, 2, 4, 1};
int[] b = new int[a.length];
System.arraycopy(a, 0, b, 0, a.length);
for (int x : b) {
 System.out.print(x + " ");
}

上述代码的第3行:System.arraycopy(a, 0, b, 0, a.length); 功能是把数组a中从索引为0开始的元素(一共a.length个)复制到数组b中,存放于索引0开始的位置。

输出:5 3 2 4 1

Arrays.copyOf()与System.arraycopy()的关系

实际上,Arrays工具类的copyOf()方法在执行时是调用了System类的arraycopy()方法的。如下图代码所示:

3、实验样例

样例一

当传入第一个数组为 [1, 2, 3, 4, 5] 时,执行完 copy() 方法后第二个数组的值为:

[1, 2, 3, 4, 5]

样例二

当传入第一个数组为 [a, b, c, d, e] 时,执行完 copy() 方法后第二个数组的值为:

[a, b, c, d, e]

package step9;

public class Solution {
    // 请在下面的Begin...End间编写代码
    /**********************Begin***********************/
    //定义非静态的泛型方法copy,用于把泛型源数组a(有值)拷贝到泛型目标数组b(无值)中
    //copy方法无需返回值
	public <T> T[] copy(T[] a,T[] b){
		for (int i= 0;i<a.length;i++){
			b[i] = a[i];
		};
		return b;
	}
    /**********************End***********************/
} 

猜你喜欢

转载自blog.csdn.net/m0_74776728/article/details/134905776