gpt4 book ai didi

java - 列表实现不解析强制转换

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:27:04 25 4
gpt4 key购买 nike

我自己制作了基于数组的列表实现,它不限制无效参数。如果我用 Actor 创建,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;
}

关于java - 列表实现不解析强制转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21658187/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com