當前位置:首頁 » 編程語言 » java泛型list

java泛型list

發布時間: 2022-03-02 13:56:18

1. java一個泛型數組List<> 怎麼復制某幾行到另外一個List<>

你明白一個單純的「?」是什麼意思嗎?它代表的是任意類型。既可以是有繼承關系的,也可以是八竿子都打不到的。比如你想寫的大約是這樣的class gen{pulbic <? extends Number>void listMove(List <?>list1 , List<?> list2,Int i){list2.add(list1.get(i));}}但是請注意這里?號代表的是任意一個Number的子類,這意味著你如果傳入像list1 是List<Long>而list2是List<Double>這樣的同級泛型參數,就像這樣來調用這個函數list1 = new List<Long >();list2 = new List<Double>();listMove(list1, list2, i);這個函數的目的顯然是把list1 的第i個元素放入list2中,但是請注意list1和list2是不相同,也沒有繼承關系的同級別類型,你正試圖把一個Long 類型放入一個只能夠放置Double類型的List 中,如果java允許你這樣來操作元素,那不是和泛型本身希望提高類型安全的目的背道而馳了嗎?這個問題里你需要注意的是,想要傳遞的類型參數是有關系的,lIst1的?號應該是list2的本身或者子類才對,你應該這樣定義你的方法,你需要對這兩個?號有一定的約束這樣來定義public < T extends Object>/*這里可以是你自己對類型的約束,我都是約束成了Object的*/void listMove(List<? extends T> list1//有條件的約束,?應該是T的子類, List<T> list2 ,int i){
list2.add(list1.get(i));
}

2. JAVA 泛型。為什麼List < extends Number> list 只能添加null

很簡單啊,因為泛型上界List <? extends Number> list;這種只能作用在引用上,表示這個引用可以指向new List<Number>()或者new List<Integer>(),但是無論怎麼指向,實際指向的對象都必須有具體且單一的類型。

//B是C和D的基類,C和D都繼承於B
List<?extendsB>b;
List<C>c=newArrayList<>();
c.add(newC());
b=c;//b引用可以指向c
b.forEach(System.out::println);//正常列印
//-----------------------------
List<D>d=newArrayList<>();
d.add(newD());
b=d;//也可以指向d
b.forEach(System.out::println);//正常列印
//上面的指向的對象都是具體的類型
b=newArrayList<?>();
b=newArrayList<?extendsB>();
//上面兩個提示通配符?無法直接實例化
//下面這個提示類型不匹配
b=newArrayList<Object>();

3. 關於java泛型集合轉換問題,下圖是List<String>類型數據,求問怎麼轉換為List<T>類型

public class Test {
public static void main(String[] args){
List<A> list = new ArrayList<A>();
A a1 = new A("101","01","122222222","上海");
A a2 = new A("102","02","133333333","南京");
A a3 = new A("103","03","142333223","上海");
A a4 = new A("104","04","125555552","上海");
list.add(a1);
list.add(a2);
list.add(a3);
list.add(a4);

}
}
class A{
private String ID;
private String num;
private String iphone;
private String address;
public String getID() {
return ID;
}
public void setID(String iD) {
ID = iD;
}
public String getNum() {
return num;
}
public void setNum(String num) {
this.num = num;
}
public String getIphone() {
return iphone;
}
public void setIphone(String iphone) {
this.iphone = iphone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public A(String id,String num,String iphone,String address){
this.ID = id;
this.num = num;
this.iphone = iphone;
this.address=address;
}
}

我寫了個例子,應該能明白了吧?也就是吧你集合的數據封裝成一個對象,這樣泛型的時候就可以泛型成這個對象了。A也就是你說的T 這樣就是你要的把數據封裝成了A類對象

希望能幫到你!

4. java泛型 List<String>[] list=new ArrayList[10]; list[1].add("abc");//空指針異常,這是為什麼

1 import java.util.*;
2 public class Fanxing{

3 public static void main(String args[]){
//初始化一個數組長度為10。裡面每的一個類型為List<String>類型
4 List<String> list[]=new ArrayList[10];//使用ArrayList初始化長度為10(因為List是介面所以只能使用其子類初始化,初始化就是指定數組長度)的數組,或者理解為創建長度為10的數組。
//為數組中第2個變數賦初值。
5 list[1]=new ArrayList();
//操作該初值,初值為List鏈表,操作鏈表為鏈表增加一個值;
6 list[1].add("sss");//增加String正確
7 list[1].add(new Integer(10));//增加Integer錯誤,證明第6行的List<String>對list[]變數的泛型約束有效
8 String s=list[1].get(0);//沒有報類型轉換錯誤,同樣證明第6行的List<String>對list[]變數的泛型約束有效
9 System.out.println(s);
}

}
/**
*第7行就是指定一個數組的長度,數組的初始化,是固定寫法,不可以寫作 new ArrayList<String>();之所以有這個數組初始化的另類,是因為sun要告知Java程序員泛型並不存在於JVM。
*總結 語法規則:數組的初始化的含義即指定數組的長度,需要注意的是泛型類型的數組初始化必須使用自然類型。sun是為了告知Java程序員泛型並不存在於JVM
*/

5. java泛型List<>用法

1.1 list.get()返回類型為?,所以你只能用Object接收,Object足以確保type-safe,因為java中任何class都是Object的subclass。(當然,如果你非要使用類型強制轉換,轉換成什麼阿貓阿狗的class,也沒人攔得住你,對此只能說「編譯器盡力了,你行你上啊」,反正ClassCastException什麼的最有愛了)
2.2 list.put()除了null以外,任何參數都不接收。這也足以確保list中類型的type-safe,要知道,java的泛型的implementation是基於ERASURE(擦除)的,舉個具體的例子,LinkedList<E>的內部數據結構肯定是基於Node<E>,那麼一個Node有2個field,E element和Node<E> next,而實際上在runtime環境中,LinkedList<String>中的Node並不是Node<String>,僅僅是Node,Node裡面的element的類型也不是String,僅僅是Object,也就是說,compile-time的type-information都被抹除了(Quote: For backward-compatibility)。試想這么一個情景,Tom傳了一個List<Dog>給Mike,Mike的interface是List<?>,Mike往list中放了一個Cat(假設compiler沒有阻止Mike),然後Tom取出該List中所有的object並當成Dog使用(compiler會自動加上類型轉換的代碼——which is how java generics worked),然後Tom就悲劇地得到了一個ClassCastException——這就是為什麼除了null其他參數都不接收的原因——阻止Mike隨便放東西進去。
2、List
raw-type就是這么個情況,相當於你對compiler說:「我並不在乎這個List裡面的element的runtime-type是什麼,不管我怎麼操作這個list或者list中取出來的object,你都別管,實在看不過去就給我個warning就行了」。這種情況下:
2.1 list.get()返回類型為Object,當然,也是type-safe的(如果你不強制轉換的話)
2.2 list.put()的參數類型為Object,也就是說,你愛往裡面放什麼object就放什麼object,還是上面那個例子,就算Tom給Mike的是List<String>,但由於Mike的interface是List,所以Mike放個BigInteger甚至什麼Cat、Dog,compiler都不會阻止Mike(但是,要知道,Mike是無法得知其他人會怎麼使用這個List的,比如說Mike無法得知Tom相信編譯器確保了list中的object都是String,但是由於Mike的raw-type interface,Tom就難免吃ClassCastException咯)

6. JAVA中List泛型和ArrayList泛型的關系和區別

List是一個介面 ArrayList是LIst介面下的一個實現類
List<UserVo> list = new ArrayList<UserVo>();
子類的對象動態的指向父類
這樣的好處是
ArrayLIst可以隨便改變實現類 而list對象不用變
比如
List<UserVo> list=new LinkedList<UserVo>();

7. java中泛型List問題

您好,我用斷點調試解釋吧[真的很高興能與你討論][啊啦上回不好意思但還是說對一部分滴].
1-----你在go方法中,沒有給list限制泛型約束,所以1.1不加check的存儲進arraylist了.

2-----"1.1"是被內部機制轉換為Double存儲進arraylist的:

[在System.out.println(list.get(1));處下斷點,點調試.可以看到list里是
[1, 1.1],
elementData[]為
[1, 1.1, null, null, null, null, null, null, null, null].
elementData[0]的值是"1",
elementData[1]的值為Double (標識=37).]

也就是說,go方法add時因為沒有約束,所以由內部機制將1.1轉換為Double存入了以String為約束的list里.

3-----點"單步跳入",看到代碼跳到了arraylist的get里:
public E get(int index) {
RangeCheck(index);

return elementData[index];
}
關鍵點就在這了,由第2步看到elementData[1]的類型為Double,而在main里為list設置的約束是String,所以E 為String.上面的代碼就變為:
public String get(int index) {
RangeCheck(index);

return 1.1; //double
}
繼續跳,
看到他照樣返回了一個加著String標簽的double值.

4-----繼續點然後報錯了.這個是由於syso輸出是輸出String.這個後面會說.

如果你加一個方法:
public static void go1(List list)
{
System.out.println(list.get(1));
}
這樣沒約束的情況下syso,是沒有錯的.因為get後的對象沒有加類型標簽,會由內部機制判斷他到底是哪個類.
而加了String返回類型標簽後就不做判斷直接調用syso(String)的方法來輸出Double了.所以報告了class cast錯誤.
如果你繼續看,會看到是String類的init出現的錯誤.
因為前面調試中看到syso(args)的args為String[],而返回的卻是Double.類型沒匹配上.

正確的那個例子不用說了吧,調試一下會發現他syso時String.valueof(obj)了,"1.1"肯定滿足條件.[如果不滿足條件,會列印object,這也是能輸出syso(list)的原因][SYSO在控制台輸出的是字元,如果是double會轉為字元輸出]

而錯的那個因為返回標明了是String,所以程序不加判斷就直接write了,輸出字元卻給個double,就出錯了.

上班了...打一中午,555,可能說的有錯誤,樓主自己調試一下,以自己的方式理解一下吧>_<
PS:其實俺上回說的有一部分對...我樓上那位5級大哥說的也部分對,但1.1是double傳進去的,沒轉換成int.調試過我就明白了,一開始我也那麼想.

8. java 泛型list如何遍例

這里不是個二維數組,是個list
你可以這樣遍歷
for(int i=0;i<a.size();i++){
Object o =(Object) a.get(i);
}

9. java泛型方法可以返回 List<T> 嗎

可以!!返回值必須是你定義的類型包含的泛型也必須一樣

10. java 泛型 List 怎麼當做函數的傳遞參數

你想把e1 當參數。那麼你List<Entity1> e1=new ArrayList<Entity1>();//定義為全局變數
然後
public void updateEntity1(e1);//調用就可以了

{

熱點內容
數據存儲路徑的底層邏輯 發布:2025-07-17 06:13:46 瀏覽:623
服裝腳本設計表 發布:2025-07-17 06:13:36 瀏覽:951
php視頻李炎恢 發布:2025-07-17 06:11:22 瀏覽:760
actionscript源碼 發布:2025-07-17 06:04:51 瀏覽:72
c編譯時多態 發布:2025-07-17 05:56:00 瀏覽:845
軟體伺服器超時是什麼意思 發布:2025-07-17 05:55:59 瀏覽:349
c語言期末試卷 發布:2025-07-17 05:49:58 瀏覽:404
64位access資料庫 發布:2025-07-17 05:35:58 瀏覽:374
php文件的相對路徑 發布:2025-07-17 05:34:22 瀏覽:711
矢量的叉乘運演算法則 發布:2025-07-17 05:29:41 瀏覽:661