導航:首頁 > 編程語言 > javalist泛型返回

javalist泛型返回

發布時間:2022-08-01 08:48:47

java中list的泛型問題

是的

上面是ArrayList的get方法,返回時是強轉了

如果不指定泛型就是Object類型的,如果指定了泛型,類型不對的話你put都put不進去的

② 根據不同的參數list怎麼返回不同的泛型結果

首先你得明白,Java裡面泛型的用處,Java為了變數能在虛擬機(JVM)中合理分配並高效實用內存,才出了泛型這個東東。
你的意思應該是如果一個方法返回的是處理結果是List<String>,那麼獲得了方法的值直接是List<String>,不用強制轉換就能實用;如果返回的是List<Map>,那麼同樣獲得返回值就是List<Map>類型,也不用強轉對吧?

如果是這樣,你的想法就目前的JDK版本來說是實現不了的。

建議你還是返回Object類型,然後強轉吧。
如果你使用Object作為返回值,你可以創建單獨的數據類型檢測方法做做強制類型轉換。

不要偷懶哦:-)

③ 請教java List 泛型轉換

如:List<String> list = new ArrayList<String>(); list.add("1");
list.add("2");
採用泛型寫法後,list想加入一個Integer類型的對象時會出現編譯錯誤,通過List<String>,直接限定了list集合中只能含有String類型的元素,從而在後續如果進行for循環就無須進行強制類型轉換,因為此時,集合能夠記住元素的類型信息,編譯器已經能夠確認它是String類型了。

④ java泛型的一些疑問

重點在

publicclassBeanListHandler<T>implementsIResultSetHandler<List<T>>

IResultSetHandler<List<T>>

來看IResultSetHandler的定義

<T>

你就可以看到定義中<>內就是泛型T,而實現IResultSetHandler時<>內的是List<T>。

所以呢對於IResultSetHandler介面來說,List<T>就是這個泛型對象,所以最後返回的也是一個list。

如果兩個相同的T對你產生了干擾,你可以把其中一個T改成K、V等等。

比如這樣

<K>{
Khandler(ResultSetset)throwsException;
}

這樣就更好理解了,實現類的List<T>就是K,返回的K就是返回List<T>

⑤ java 方法中如何在返回類型使用泛型

主要是一個編譯期的檢查,也避免了我們代碼中的強制轉換,比較經典的用法有泛型DAO,泛型Page的DTO。

現在我要說的是一個挺有趣但是貌似還不是太多的人在代碼中使用的方法,前段時間用guava和op4j的時候發現這樣的用法,看看了源碼,也是很簡單的。

比如guava中創建集合的方法 List<xx> list = Lists.newArrayList(),這個代替了我們傳統的 new ArrayList<xx>,為什麼在=的右邊不需要泛型了呢,我們看看源碼。

[java] view plain
public static <E> ArrayList<E> newArrayList() {
return new ArrayList<E>();
}
返回類型中帶有泛型E,並且這個泛型的來源在 static和 ArrayList之間的位置,我自己的理解是這個就和=左邊的一致,可能說的不夠專業但是意思應該就這樣。

於是我就依樣畫葫蘆在自己的代碼中也用了起來。

我要做的是一個仿httpsession機制的自定義協議是session。在httpsession.getAttribute方法返回的是一個
Object,然後我們再類型轉換。現在我用返回類型泛型來優化這個代碼,以下是我自定義協議session的getAttribute的代碼。
[java] view plain
@SuppressWarnings("unchecked")
public <E> E getAttribute(String key) {
return (E) map.get(key);
}
調用代碼
[java] view plain
Boolean isFirst = session.getAttribute("first");
在httpsession中我們則要這么寫
[java] view plain
Boolean isFirst = (Boolean)session.getAttribute("first");

泛型的用法還有很多,有新的心得再補充更新

⑥ 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.調試過我就明白了,一開始我也那麼想.

⑦ 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中的泛型用法一種: <T> 返回值用法。

1、對於泛型方法來說,是可以接收不同類型的參數,比如下圖,使用泛型來操作List集合,然後向List中添加一條數據,看是否可以添加成功,創建泛型方法如圖所示。

⑨ JAVA 定義方法里,前面是list類型,那麼返回應該是什麼

這個方法應該返回list塞,,
把log對象放到list中,然後返回list就OK 。
這樣放。

ArrayList list=new ArrayList();
while(rs.next()){
log=new Log();
log.setId(rs.getInt(1));
log.setLog_title(rs.getString(2));
log.setLog_content(rs.getString(3));
log.setLog_date(rs.getDate(4));
log.setRemark(rs.getString(5));
list.add(log);//把log放到list.
}

return list;

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

答案是肯定的!

publicclassDemo01<E>{

privateList<E>list=newArrayList<E>();

publicList<E>store(E[]arr){
list=Arrays.asList(arr);
returnlist;
}

publicstaticvoidmain(String[]args){
Demo01<String>d=newDemo01<>();
Stringanimals[]={"Cat","Dog","Pig","Monkey"};
List<String>list=d.store(animals);
for(Stringstring:list){
System.out.print(string+" ");
}
}
}
閱讀全文

與javalist泛型返回相關的資料

熱點內容
linux樹形目錄 瀏覽:727
平方根的簡單演算法 瀏覽:898
千牛訂單頁面信息加密取消 瀏覽:558
單片機自製紅外遙控燈 瀏覽:719
伺服器最小配置怎麼弄 瀏覽:853
ibm伺服器硬體如何升級 瀏覽:923
全球程序員節點贊 瀏覽:986
php函數傳遞數組 瀏覽:631
人工峰群演算法的目標函數 瀏覽:468
如何刪加密文檔 瀏覽:105
塗鴉app一鍵執行如何刪除 瀏覽:756
安卓手機如何打開fr3文件 瀏覽:743
壓縮袋8絲和14絲是什麼意思 瀏覽:647
程序員大咖java 瀏覽:70
蘋果手機文檔安卓上怎麼打開 瀏覽:527
如何做淘寶代理伺服器 瀏覽:672
gz壓縮文件夾 瀏覽:179
字母h從右往左跑的c語言編程 瀏覽:137
安卓手機如何擁有蘋果手機橫條 瀏覽:771
業余編程語言哪個好學 瀏覽:151