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

泛型數組java

發布時間: 2022-11-16 23:09:27

1. 泛型和數組以及java是如何實現泛型的

要區分數組和泛型容器的功能,這里先要理解三個概念:協變性(covariance)、逆變性(contravariance)和無關性(invariant)。
若類A是類B的子類,則記作A ≦ B。設有變換f(),若:
當A ≦ B時,有f(A)≦ f(B),則稱變換f()具有協變性;

當A ≦ B時,有f(B)≦ f(A),則稱變換f()具有逆變性;

如果以上兩者皆不成立,則稱變換f()具有無關性。

在Java中,數組具有協變性,而泛型具有無關性,示例代碼如下:
Object[] array = new String[10];

//編譯錯誤
ArrayList<Object> list=new ArrayList<String>();

這兩句代碼,數組正常編譯通過,而泛型拋出了編譯期錯誤,應用之前提出的概念對代碼進行分析,可知:
1、String ≦ Object
2、數組的變換可以表達為f(A)=A[],通過之前的示例,可以得出下推論:

f(String) = String[] 以及 f(Object) = Object[];
4、通過代碼驗證,String[] ≦ Object[] 是成立的,由此可見,數組具有協變性。

2. java 泛型數組怎麼實例化

思路:
1 獲取泛型的實際類型;
2 調用構造方法 進行實例化;

3. java為什麼不支持泛型數組

由於JVM泛型的擦除機制,在運行時JVM是不知道泛型信息的,所以可以給oa[1]賦上一個ArrayList<Integer>而不會出現ArrayStoreException,但是在取出數據的時候卻要做一次類型轉換,所以就會出現ClassCastException,如果可以進行泛型數組的聲明,上面說的這種情況在編譯期將不會出現任何的警告和錯誤,只有在運行時才會出錯。而對泛型數組的聲明進行限制,對於這樣的情況,可以在編譯期提示代碼有類型安全問題,比沒有任何提示要強很多。
基於以上的原因,Java不支持聲明泛型數組,更確切地表達是:數組的類型不可以是類型變數,除非是採用通配符的方式,

4. JAVA怎麼初始化泛型數組

首先由於Java泛型的實現,不可以使用如下的代碼:

public class GenSet<E> {
private E a[];

public GenSet() {
a = new E[INITIAL_ARRAY_LENGTH]; // error: generic array creation
}
}

那麼我們如何在保持類型安全的同時實現這一點?

我在Java論壇上看到了這樣的解決方案:

import java.lang.reflect.Array;

class Stack<T> {
public Stack(Class<T> clazz, int capacity) {
array = (T[])Array.newInstance(clazz, capacity);
}

private final T[] array;
}

在這里,我們需要討論"checked" and "unchecked"。

Checked:strong typing。GenSet明確知道它包含的對象類型(即它的構造函數是使用Class <E>參數顯式調用的,當方法傳遞非類型E的參數時,方法將拋出異常。請參閱Collections.checkedCollection。

在這種情況,我們需要這樣寫:

public class GenSet<E> {

private E[] a;

public GenSet(Class<E> c, int s) {
// Use Array native method to create array
// of a type only known at run time
@SuppressWarnings("unchecked")
final E[] a = (E[]) Array.newInstance(c, s);
this.a = a;
}

E get(int i) {
return a[i];
}
}



Unchecked: weak typing。實際上沒有對作為參數傳遞的任何對象進行類型檢查。

在這種情況,我們需要這樣寫:

public class GenSet<E> {

private Object[] a;

public GenSet(int s) {
a = new Object[s];
}

E get(int i) {
@SuppressWarnings("unchecked")
final E e = (E) a[i];
return e;
}
}

請注意,數組的組件類型應該是類型參數的擦除:

public class GenSet<E extends Foo> { // E has an upper bound of Foo

private Foo[] a; // E erases to Foo, so use Foo[]

public GenSet(int s) {
a = new Foo[s];
}

...
}

所有的這些都源於Java中泛型一個的特性但也是一個weakness:它是使用擦除實現的,因此除非實施一些顯式機制(type-checking),否則「泛型」類不知道它們在運行時創建的類型參數,故無法提供 type-safety。

5. java中關於泛型與數組的疑問

public static void main(String[] args) {

// 不能使用泛型數組

// Cannot create a generic array of List<String>

//List<String>[] lists = new List<String>[10];


// 但是你可以使用集合數組, 如果你非要這樣做的話

List[] test2 = new List[10];


// 我不確定你這樣做的動機是什麼, 如果非要使用到泛型集合數組的話, 也可以這樣

// Key: 索引

// Value: 泛型集合

// 缺點: 索引需要自己維護

Map<Integer, List<String>> collectionArray = new LinkedHashMap<Integer, List<String>>();

}

6. java 泛型數組add出錯

一樓說的在理。
因為list里放的是對象是引用類型的,如果你一直new,那麼改變的是同一個對象值。

7. JAVA為什麼不讓創建泛型數組

首先,覺得定製java標準的完全可以讓java創建泛型數組;只是權衡了一下,覺得還是禁止了的好,一下就說說揣測:

(1):如果寫如下代碼是可以的:

可以發現,堆中的第0個元素是List了,但是arr[0]還是指向了它,如果是普通變數,這是不可能的;所以,即便是引入了泛型,也不是安全的;

總結:由於編譯器會加上string轉化,造成ClassCastException;泛型本來就是為了安全,如果不能保證數組的安全,這就是一樣的。

8. 請問,Java中,泛型數組的數組怎麼初始化(就是ArrayList數組)

既然你暗示就是ArrayList了,
首選就從Arraylist想了

可以試試:

import java.util.ArrayList;
public class Test{
public static void main(String[]args){
ArrayList<ArrayList<Integer>> als = new ArrayList<ArrayList<Integer>> ();
ArrayList<Integer> a1 = new ArrayList<Integer>();
ArrayList<Integer> a2 = new ArrayList<Integer>();
ArrayList<Integer> a3 = new ArrayList<Integer>();
ArrayList<Integer> a4 = new ArrayList<Integer>();
//下面是添加行,你可以用循環添加固定的行
//每一列就是一個ArrayList<Integer>,你可以任意添加,長度不固定吧
als.add(a1);
als.add(a2);
als.add(a3);
als.add(a4);
System.out.println(als.size());

}
}

tao_3000的方法可行,只是Integer[]創建時要指定維數
可以自己寫個演算法自動增加維數

對於你說的數據量問題,個人理解是這樣的:

達到了幾十萬幾百萬的數據量的時候,我想大概就是從資料庫中吧數據讀取出來,進行批量的處理或者更新之類的操作。
你說得很對,如此龐大的數據量肯定會使效率降低,
但是我們完全可以一次從資料庫中讀取幾百條記錄,進行操作

關於如何從資料庫中一次讀取很少的記錄,jdbc和hibernate都有相應的實現

在者,數據量過大,呵呵,JVM可能崩潰哦 *_*

9. java泛型數組

publicclassDemoFanXing{
publicstaticvoidmain(String[]args){
Arr<Integer>a=newArr<Integer>();
a.setArray(1,2,3,4,5,6);
for(intx:a.getArray()){
System.out.print(x+"");
}
}
}

classArr<T>{
privateT[]arr;
//public<T>voidsetArray(T...arg),多了一個<T>
publicvoidsetArray(T...arg){
this.arr=arg;
}
publicT[]getArray(){
returnarr;
}
}

熱點內容
pythonnumexpr 發布:2025-01-13 19:34:56 瀏覽:489
linuxpython版本查看 發布:2025-01-13 19:18:37 瀏覽:741
寶馬三系的哪個配置走量 發布:2025-01-13 19:12:14 瀏覽:695
區域網如何訪問伺服器 發布:2025-01-13 18:56:24 瀏覽:189
javaarraylist訪問 發布:2025-01-13 18:56:10 瀏覽:671
如何確定膠體是否配置成功 發布:2025-01-13 18:46:07 瀏覽:73
fgo緩存多大 發布:2025-01-13 18:42:13 瀏覽:972
能緩解壓力的水果 發布:2025-01-13 18:15:36 瀏覽:391
怎麼把文件壓縮成文件 發布:2025-01-13 18:15:33 瀏覽:610
壓縮機配件網 發布:2025-01-13 18:15:00 瀏覽:48