泛型数组初始化

  1. 对整个数组强制转型的例子(错误方法);
package test;

public class GenericParadigm<T> {

		private T[] array;

		public GenericParadigm(int sz) {
			array = (T[]) new Object[sz];
		}

		public void put(int index, T item) {
			array[index] = item;
		}

		public T get(int index) { return array[index]; }

		public T[] rep() { return array; } //应该在运行时出口做文章

		public static void main (String[] args){

			GenericParadigm gai = new GenericParadigm(10);
	
			// Integer[] ia = gai.rep(); //ClassCastException
	
			Object[] oa = gai.rep(); //只能返回对象数组类型为Object[]
		}

}

实际的运行时对象数组是Object[],而实际的运行时数组对象可能是T类型。

因此,应该在运行时,数组对象的出口做转型输出,入口方法在编译期已实现类型安全,所以出口方法可以放心强制类型转换,保证成功.

public class GenericArray2 {

	private Object[] array; //维护Object[]类型数组
	
	public GenericArray2(int sz) {
		array = new Object[sz];
	}
	
	public void put(int index, T item) {
	array[index] = item;
	}

	public T get(int index) { return (T)array[index]; }//数组对象出口强转
	
	public T[] rep() { return (T[])array; } //运行时无论怎样都是Object[]类型

	public static void main (String[] args){
		GenericArray gai = new GenericArray(10);
		// Integer[] ia = gai.rep(); //依旧ClassCastException
		Object[] oa = gai.rep(); //只能返回对象数组类型为Object[]
		gai.put(0,11);
		System.out.println(gai.get(0)); // 11 ,出口成功转型
	}
}
  1. 通过反射在运行时构出实际类型为type[]的对象数组,避免了类型擦除,从而转换成功,无ClassCastException.
public class GenericArrayWithTypeToken {

   	private T[] array;

   	public GenericArrayWithTypeToken(Class type, int sz) {
   		array = (T[]) Array.newInstance(type, sz);//通过反射在运行时构出实际类型为type[]的对象数组,避免了类型擦除,从而转换成功,无ClassCastException
   	}
   	
   	public void put(int index, T item){
   		array[index] = item;
   	}
   	
   	public T get(int index) { return array[index]; }
   	
   	public T[] rep() { return array; } //能成功返回了~
   	
   		public static void main(String[] args) {
   		GenericArrayWithTypeToken gawtt = new GenericArrayWithTypeToken<>(Integer.class, 10);
   		Integer[] ia = gawtt.rep(); //能成功返回了!
   		}
}

模板

public class ArrayQueue<T> {
    private int front=0;//头部指针,空
    private int rear=0;//尾部指针,有值
    private int maxSize=10;//容量,默认给10
    private T[] array;//数组,存储内容

    public ArrayQueue(Class<T> clazz,int maxSize) {
        this.maxSize = maxSize;
        array = (T[]) Array.newInstance(clazz, maxSize);
    }
}

结论

不能(直接)创建泛型数组

泛型数组实际的运行时对象数组只能是原始类型( T[]为Object[],Pair[]为Pair[] ),而实际的运行时数组对象可能是T类型( 虽然运行时会擦除成原始类型 )

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在西门子SCL博途中,可以通过以下步骤来读取任意长度的泛型数组的最大值及其索引: 1. 声明一个泛型数组,例如`data`,并初始化数组,例如`data := [1, 3, 5, 2, 4]`。 2. 声明一个变量`maxValue`,用于存储最大值。初始时,将`maxValue`赋值为数组的第一个元素,即`maxValue := data[0]`。 3. 声明一个变量`maxIndex`,用于存储最大值的索引。初始时,将`maxIndex`赋值为0,即`maxIndex := 0`。 4. 使用循环结构(例如`FOR`或`WHILE`)依次遍历数组中的每个元素。 5. 在循环内部,使用条件判断语句(例如`IF...THEN...`)来比较当前元素与`maxValue`的大小。 6. 如果当前元素大于`maxValue`,则将`maxValue`更新为当前元素的值,并将`maxIndex`更新为当前元素的索引。 7. 继续遍历数组直到所有元素都被比较完毕。 8. 循环结束后,`maxValue`即为数组中的最大值,`maxIndex`即为最大值的索引。 以下是一个示例代码实现: ``` VAR data: ARRAY[1..5] OF INT := [1, 3, 5, 2, 4]; maxValue: INT; maxIndex: INT; FOR i := 1 TO 5 DO IF data[i] > maxValue THEN maxValue := data[i]; maxIndex := i; END_IF; END_FOR; // 输出结果 PRINT("最大值: " + INT_TO_STRING(maxValue)); PRINT("最大值索引: " + INT_TO_STRING(maxIndex)); ``` 通过以上代码,可以读取任意长度的泛型数组中的最大值及其索引。代码根据数组的长度,逐个比较数组元素,找到最大值,并记录其索引,最后输出结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值