由于方法 -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在removeRangeArrayList 的方法中使用呢?
uj5u.com熱心網友回復:
能夠存盤任何型別的物件的方法MyClass不僅僅是String引入一個型別引數 T來填充型別。然后宣告將是
public class MyClass<T> extends ArrayList<T>
但是,您必須指定T宣告MyClass變數時的內容。這意味著您需要將變數宣告和初始化更改為
MyClass<String> arrayList1 = new MyClass<>();
它告訴編譯器使用什么型別代替T.
uj5u.com熱心網友回復:
你的前提:
由于方法 - removeRange(int startIndex, int) 是受保護的,我們需要在擴展 ArrayList 的類中使用它。
… 是不正確的。
??removeRange不應該從課外呼叫。所以不需要創建你的子類。
相反,呼叫List#subListand List#clear。
list.subList( start , end ).clear() ;
請參閱 Javadoc AbstractList#removeRange:
此方法由
clear對該串列及其子串列的操作呼叫。
請參閱Effective Java第 2 版的第 40 項。
請參閱這篇文章中的討論。
示例代碼:
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]
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/476747.html
上一篇:有沒有辦法創建一個在檔案名中不包含日期戳的Serilog非滾動檔案接收器?
下一篇:為什么從子類呼叫時超類欄位不同?
