❶ 怎麼獲取一個泛型List的元素類型
package test;
import java.util.ArrayList;
import java.util.List;
public class Test01 {
public static void main(String[] args) {
List strings = new ArrayList();
strings.add("123");//模擬返回一個泛型
System.out.println(strings.getClass());//第一次取類型
System.out.println(strings.get(0).getClass());//假如通過第一步知道是ArrayList類型,則再取類型
}
}
❷ 在android中 List 和ArrayList的區別,越詳細越好
List是一個介面,而ArrayList是List的一個實現類,對於android和J2SE來講,兩者之間的區別不大。
❸ 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.調試過我就明白了,一開始我也那麼想.
❹ List集合使用泛型與不使用泛型有什麼區別
泛型其實還有一個通俗的名字:參數化類型(使用參數指明了該傳什麼類型)。就是明確指定了運行期集合中對象的類型。如果沒有泛型,那我一切的對象直接使用Object和強制類型轉換就解決了不是嗎?但是這種有個問題,就是會在運行期出現隨處可見的強制類型轉換異常ClassCastException。而指定了參數化類型,是不是我們在編譯期就進行檢查了,傳入List<String>類型,List裡面只能放入String,你add其他類型編譯不會通過的,就不要提運行期檢查了。。。所以你提泛型搞不懂就理解為參數化類型這個事就完事了
❺ java 泛型 List 怎麼當做函數的傳遞參數
不行你這樣肯定改不了,
List<Entity1> e1=new ArrayList<Entity1>();//這句話拿到方法外面,e1必須是靜態的。
否則你的操作怎麼農弄都失敗
import java.util.ArrayList;
import java.util.List;
public class Entity2 {
List<Entity1> e1=new ArrayList<Entity1>();
private void setEntity1(Entity1 e) {
e1.add(e);
}
public List<Entity1> getEntity1(){
return e1;
}
public void updateEntity1(Entity1 e) {
//-----------------根據條件修改
}
}
❻ 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咯)
❼ java中泛型 例如List<>這個<>內存放的是什麼 幫忙分析一下下面程序
泛型集合!!
指定List存放的類型;
程序分析:
這個程序是對資料庫T_YW_KHXXB表進行查詢的操作;
1.定義T_YW_KHXXB表所對應的實體Bank 其中每個屬性與T_YW_KHXXB表中的欄位一一對應
2.聲明sql查詢語句 String sql = "SELECT DH,DZ,KHBH,ZJHM,XM FROM T_YW_KHXXB";
3.List<Bank> list = new ArrayList<Bank>();定義一個集合存儲Bank屍體對象對象
4.PreparedStatement ps = con.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
執行SQL語句並返回ResultSet對象集(結果集)
5.把結果集讀取出來並存入List集合對象當中,讓後返回這個List集合對象
❽ JAVA中List泛型和ArrayList泛型的關系和區別
List是一個介面 ArrayList是LIst介面下的一個實現類
List<UserVo> list = new ArrayList<UserVo>();
子類的對象動態的指向父類
這樣的好處是
ArrayLIst可以隨便改變實現類 而list對象不用變
比如
List<UserVo> list=new LinkedList<UserVo>();
❾ android java 泛型多嗎
泛型,即「參數化類型」。一提到參數,最熟悉的就是定義方法時有形參,然後調用此方法時傳遞實參。那麼參數化類型怎麼理解呢?顧名思義,就是將類型由原來的具體的類型參數化,類似於方法中的變數參數,此時類型也定義成參數形式(可以稱之為類型形參),然後在使用/調用時傳入具體的類型(類型實參)。
看著好像有點復雜,首先我們看下上面那個例子採用泛型的寫法。
public class GenericTest {
public static void main(String[] args) {
/*
List list = new ArrayList();
list.add("qqyumidi");
list.add("corn");
list.add(100);
*/
List<String> list = new ArrayList<String>();
list.add("qqyumidi");
list.add("corn");
//list.add(100); // 1 提示編譯錯誤
for (int i = 0; i < list.size(); i++) {
String name = list.get(i); // 2
System.out.println("name:" + name);
}
}
}
❿ java中使用list泛型新增數據問題
List<String> l = new ArrayList<String>(); 檢查一下在你的工程里已經有個一類叫String 所以編譯器默認的是你定義的String 類 而不是java.lang.String 就會出現你所說的報錯 如果檢查清楚不是這個問題的話 嘗試clean一下你的工程看下