Как использовать дженерики для безопасности типов при использовании метода `removeRange` ArrayList

Поскольку метод - 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?

@ Эритрея Что такое Т?

Payel Senapati 18.05.2022 00:13

«… нам нужно использовать его в классе, расширяющем ArrayList». Нет, это не так. list.subList(startIndex, endIndex).clear() сделает то же самое. Подкласс не нужен.

VGR 18.05.2022 00:31
Основы программирования на Java
Основы программирования на Java
Java - это высокоуровневый объектно-ориентированный язык программирования, основанный на классах.
Концепции JavaScript, которые вы должны знать как JS программист!
Концепции JavaScript, которые вы должны знать как JS программист!
JavaScript (Js) - это язык программирования, объединяющий HTML и CSS с одной из основных технологий Всемирной паутины. Более 97% веб-сайтов используют...
0
2
32
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ваша предпосылка:

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.

Другие вопросы по теме