我创建了自己的基于数组的列表实现,并且它不限制无效参数。如果我使用强制转换创建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;
}
}
答案 0 :(得分:7)
您的所有方法本身都是通用的。因此,它们有自己的类型参数,与您的类声明的类型参数无关。以下方法声明是通用的:
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;
}