Issue
Since the method - removeRange(int startIndex, int )
is protected, we need to use it in a class extending ArrayList. Below is my code -
public class MyClass extends ArrayList<String> {
public static void main(String[] args) {
MyClass arrayList1 = new MyClass();
arrayList1.add("Zebra");
arrayList1.add("Giraffe");
arrayList1.add("Bison");
arrayList1.add("Hippo");
arrayList1.add("Elephant");
MyClass arrayList2 = (MyClass) arrayList1.clone();
MyClass arrayList3 = (MyClass) arrayList1.clone();
System.out.println(arrayList1);
System.out.println(arrayList2);
System.out.println(arrayList3);
arrayList1.removeRange(0, 3);
arrayList2.removeRange(3, 5);
arrayList3.removeRange(2, 4);
System.out.println(arrayList1);
System.out.println(arrayList2);
System.out.println(arrayList3);
}
}
Output -
[Zebra, Giraffe, Bison, Hippo, Elephant]
[Zebra, Giraffe, Bison, Hippo, Elephant]
[Zebra, Giraffe, Bison, Hippo, Elephant]
[Hippo, Elephant]
[Zebra, Giraffe, Bison]
[Zebra, Giraffe, Elephant]
Now to use type safety I need to write - MyClass<String> extends ArrayList<String>
but doing so gives error in main method of String[]
-
MyClass.This cannot be referenced from a static context
So how is it possible to use generics
in removeRange
method of ArrayList?
Solution
The way to make MyClass
able to store objects of any type, not just String
is to introduce a type parameter T
which fills in for the type. The declaration will then be
public class MyClass<T> extends ArrayList<T>
But then, you have to specify what T
is when you declare a MyClass
variable. This means you'll need to change your variable declarations and initialisations to things like
MyClass<String> arrayList1 = new MyClass<>();
which tells the compiler what type to use in place of T
.
Answered By - Dawood ibn Kareem
Answer Checked By - David Goodson (JavaFixing Volunteer)