Java – lists implementations that do not resolve casts
I created my own array - based list implementation, and it doesn't limit invalid parameters If I use cast to create mylist < string > mylist = new mylist < string > (), it will still accept all other parameters (int, float, double, etc.) If all data types to be accepted are specified, how can I solve this problem; If no data type is specified, I hope it works now
This is my code:
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;
}
}
Solution
All of your methods are generic in themselves Therefore, they have their own type parameters, independent of the type parameters declared by your class The following method statements are generic:
public <T> boolean insertHead(T newEntry)
Therefore, regardless of the parameterized instance of the class you create, the method will accept any parameter type, and the type T of this method will be inferred as that type To solve this problem, you should delete a part of < T > each method For example, change the above method to:
public boolean insertHead(T newEntry)
In addition, your method should have the return type of t instead of object, otherwise it will fail on the caller side Change method:
public <T> Object get(int givenPosition)
{
if ((givenPosition >= 1) && (givenPosition <= size))
return contents[givenPosition - 1];
return null;
}
To:
public T get(int givenPosition)
{
if ((givenPosition >= 1) && (givenPosition <= size))
return (T) contents[givenPosition - 1]; // Add cast
return null;
}
