java – 列出不解析强制转换的实现
发布时间:2020-12-15 04:17:48 所属栏目:Java 来源:网络整理
导读:我创建了自己的基于数组的列表实现,并且它不限制无效的参数.如果我使用强制转换创建,MyList String myList = new MyList String(),它仍然会接受所有其他参数(int,float,double等).如果指定了所有将被接受的数据类型,我该如何解决这个问题;如果没有指定数据类
我创建了自己的基于数组的列表实现,并且它不限制无效的参数.如果我使用强制转换创建,MyList< String> myList = new MyList< String>(),它仍然会接受所有其他参数(int,float,double等).如果指定了所有将被接受的数据类型,我该如何解决这个问题;如果没有指定数据类型,那么我希望它现在可以正常工作.
这是我的代码: public class MyList <T> implements MyListInterface { private Object[] contents; private int size; public MyList() { this(10); } public MyList(int length) { contents = new Object[length]; size = 0; } private void alterArraySize(int value) { int len = 0; //Value is 1 shrink array; value is 2 then double it switch (value) { case 1: len = contents.length / 2; break; case 2: len = contents.length * 2; break; } Object[] copyArr = new Object[len]; //Copy array for (int i = 0; i < size; i++) { copyArr[i] = contents[i]; } contents = copyArr; } public <T> boolean insertHead(T newEntry) { size++; if ((size + 1) == contents.length) alterArraySize(2); //Shift elements up one for (int i = size; i >= 0; i--) contents[i + 1] = contents[i]; contents[0] = newEntry; return true; } public <T> boolean insertTail(T newEntry) { //If the number of items in the list if ((size + 1) == contents.length) alterArraySize(2); //Put the newEntry in the last slot in the array contents[size++] = newEntry; return true; } public <T> Object deleteHead() { //Set temp to first item in the array Object temp = contents[0]; //Delete the first item contents[0] = null; //Shift all items in the list down one position for (int i = 1; i < size; i++) { contents[i - 1] = contents[i]; } //Update size to accommodate for the item deletion size--; return temp; } public <T> Object deleteTail() { //Set temp to last item in array Object temp = contents[--size]; //Delete the last item contents[size] = null; //Resize if the number of items in the list is half the length if (size <= contents.length / 2) alterArraySize(1); return temp; } public void display() { for (int i = 0; i < size; i++) System.out.println(contents[i]); } public <T> int contains(T anEntry) { for (int i = 0; i < size; i++) { if (contents[i].equals(anEntry)) return ++i; } return 0; } public boolean isEmpty() { return size == 0; } public boolean isFull() { //List can't be full return size == contents.length; } public <T> Object get(int givenPosition) { if ((givenPosition >= 1) && (givenPosition <= size)) return contents[givenPosition - 1]; return null; } public <T> void set(T s,int givenPosition) { contents[givenPosition - 1] = s; } public <T> Object remove(int givenPosition) { Object temp = null; //Check if givenPosition is valid and shift elements after remove if ((givenPosition >= 1) && (givenPosition <= size)) { temp = contents[givenPosition - 1]; for (int i = givenPosition; i < size; i++) { contents[i - 1] = contents[i]; } contents[size--] = null; } return temp; } public int size() { return size; } } 解决方法
您的所有方法本身都是通用的.因此,它们有自己的类型参数,与您的类声明的类型参数无关.以下方法声明是通用的:
public <T> boolean insertHead(T newEntry) 因此,无论您创建的类的参数化实例如何,该方法都将接受任何参数类型,并且此方法的类型T将被推断为该类型.要解决此问题,您应该删除< T>每个方法的一部分.例如,将上述方法更改为: public boolean insertHead(T newEntry) 此外,您的方法应该具有T的返回类型而不是Object,否则在调用者端将失败.改变方法: public <T> Object get(int givenPosition) { if ((givenPosition >= 1) && (givenPosition <= size)) return contents[givenPosition - 1]; return null; } 至: public T get(int givenPosition) { if ((givenPosition >= 1) && (givenPosition <= size)) return (T) contents[givenPosition - 1]; // Add cast return null; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |