Поскольку метод - removeRange(int startIndex, int )
защищен, нам нужно использовать его в классе, расширяющем ArrayList. Ниже мой код -
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);
}
}
Выход -
[Zebra, Giraffe, Bison, Hippo, Elephant]
[Zebra, Giraffe, Bison, Hippo, Elephant]
[Zebra, Giraffe, Bison, Hippo, Elephant]
[Hippo, Elephant]
[Zebra, Giraffe, Bison]
[Zebra, Giraffe, Elephant]
Теперь, чтобы использовать безопасность типов, мне нужно написать - MyClass<String> extends ArrayList<String>
, но это приводит к ошибке в основном методе String[]
-
MyClass.This cannot be referenced from a static context
Так как же можно использовать generics
в removeRange
методе ArrayList?
«… нам нужно использовать его в классе, расширяющем ArrayList». Нет, это не так. list.subList(startIndex, endIndex).clear()
сделает то же самое. Подкласс не нужен.
Ваша предпосылка:
Since the method - removeRange(int startIndex, int ) is protected, we need to use it in a class extending ArrayList.
… это неверно.
? removeRange
не предназначен для вызова вне класса. Так что нет необходимости создавать свой подкласс.
Вместо этого вызовите List#subList
и List#clear
.
list.subList( start , end ).clear() ;
См. Javadoc для AbstractList#removeRange
:
This method is called by the
clear
operation on this list and its subLists.
См. пункт 40 Эффективная Java 2-го изд.
См. обсуждение в эта почта.
Пример кода:
List< String > original = List.of( "Zebra" , "Giraffe", "Bison", "Hippo", "Elephant" ) ;
ArrayList< String > a1 = new ArrayList <> ( original ) ;
ArrayList< String > a2 = new ArrayList <> ( original ) ;
ArrayList< String > a3 = new ArrayList <> ( original ) ;
a1.subList( 0, 3 ).clear() ;
a2.subList( 3, 5 ).clear() ;
a3.subList( 2, 4 ).clear() ;
System.out.println( a1 );
System.out.println( a2 );
System.out.println( a3 );
См. этот запуск кода в прямом эфире на IdeOne.com.
[Hippo, Elephant]
[Zebra, Giraffe, Bison]
[Zebra, Giraffe, Elephant]
Способ сделать MyClass
способным хранить объекты любого типа, а не только String
, состоит в том, чтобы ввести тип параметраT
, который заменяет тип. Тогда декларация будет
public class MyClass<T> extends ArrayList<T>
Но тогда вы должны указать, что такое T
, когда вы объявляете переменную MyClass
. Это означает, что вам нужно изменить объявления переменных и инициализации на такие вещи, как
MyClass<String> arrayList1 = new MyClass<>();
который сообщает компилятору, какой тип использовать вместо T
.
@ Эритрея Что такое Т?