JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Java SE 討論區  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友   
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
作者 宣告陣列中使用泛型類別語法的問題
weberhwang





發文: 45
積分: 0
於 2018-04-22 23:14 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
大家好
請教關於泛型類別使用在陣列宣告的問題,如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.util.*; 
 
class Test3{
  
  public static void main(String[] args){
    
    //我想建立一個陣列[]長度為10,裡面每個元素放ArrayList<String>類型的物件
    ArrayList<String>[] a = new ArrayList<String>[10]; //編譯會失敗,這是為何?
    
    //下面這種寫法編譯就會過,但這樣的效果跟我想要的效果是一致的嗎?
    //ArrayList<String>[] a = new ArrayList[10];    
  
  }
}  
 


錯誤訊息如下:
Test3.java:8: error: generic array creation
    ArrayList<String>[] a = new ArrayList<String>[10]; //編譯會失敗,這是為何?
     ^
1 error


weberhwang edited on 2018-04-22 23:27
reply to postreply to post
作者 Re:宣告陣列中使用泛型類別語法的問題 [Re:weberhwang]
layolayo2002





發文: 40
積分: 0
於 2018-04-23 01:26 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
不知道效果如何?
測試看看就知道囉

1
2
3
4
5
6
7
//a是陣列
System.out.println(a.length);
//裡面的元素是ArrayList
a[0] = new ArrayList<>();
a[0].add("aaa");
a[0].add("bbb");
System.out.println(a[0]);


reply to postreply to post
作者 Re:宣告陣列中使用泛型類別語法的問題 [Re:weberhwang]
喵太桑





發文: 6
積分: 0
於 2018-04-23 02:42 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
@weberhwang

new是呼叫一個class的類別建構子
你這邊是調用ArrayList的建構子 而建構子是一個method
所以要有(),這是第一點,第二是ArrayList是不需要給定[10]的
他本身就會依照add的次數增加大小。
所以應是如下:
ArrayList<String> a = new ArrayList<String>();
或是
ArrayList<String> a = new ArrayList<>();
兩者意思一樣

你可以有點把它跟String[] 搞混了 這兩個不一樣
給你參考~


喵太桑 edited on 2018-04-23 02:48
reply to postreply to post
By Billy
作者 Re:宣告陣列中使用泛型類別語法的問題 [Re:layolayo2002]
喵太桑





發文: 6
積分: 0
於 2018-04-23 02:47 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
@layolayo2002

您這邊應該是編譯不過的
arraylist是不能用
a[0]這種方式取值跟賦值
要用a.get(0)跟a.add("aaa");
提醒您一下 這不是String[]


reply to postreply to post
By Billy
作者 Re:宣告陣列中使用泛型類別語法的問題 [Re:喵太桑]
weberhwang





發文: 45
積分: 0
於 2018-04-23 04:54 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
不好意思,看完還是不太能理解

我知道[]這種陣列,是固定長度,與ArrayList不同,ArrayList是長度可異動的。
我是故意想試[10]固定長的Array,這裡面的元素,是否可以再放ArrayList<String>這種類別的物件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import java.util.*; 
 
class Test3{
  
  public static void main(String[] args){
    
    //宣告一個固定長為10的可以放Object的陣列
    Object[] a = new Object[10];
    
    //承上再做變化,把Object改成ArrayList,宣告10個固定長的陣列,裡面物件是放ArrayList
    ArrayList[] b = new ArrayList[10];
    
    //承上再做變化,把ArrayList改成ArrayList<String>,宣告10個固定長的陣列,裡面物件是放ArrayList<String>,編譯失敗!
    //ArrayList<String>[] c = new ArrayList<String>[10]; 
    
    //直接宣告一個長度不固定的ArrayList空間,這個我了解
    ArrayList d = new ArrayList(); 
    
    //直接宣告一個長度不固定的ArrayList空間,但裡面只能放String
    ArrayList<String> e = new ArrayList<String>();
    
    //第20行跟13行在我觀念上的差別
    //20行是1維,裡面放字串
    //13行我是想做成2維,第1個維度是固定10個元素,第2個維度是ArrayList<String>可變動,但13行的語法有誤,不知為何?
  
  }
}  
 


weberhwang edited on 2018-04-23 05:02
reply to postreply to post
作者 Re:宣告陣列中使用泛型類別語法的問題 [Re:喵太桑]
layolayo2002





發文: 40
積分: 0
於 2018-04-23 05:18 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
其實你搞混了......XD
我取到的a[0]是一個arraylist
new了以後當然可以對他直接做a[0].add()的動作
如果不確定的話可以直接用IDE來做做看

至於後面
System.out.print(a[0]);
是因為在這行的a[0]
其實意同於
a[0].toString();

至於樓上
你的問題我也不曉得該怎麼回答....
就是錯誤寫法阿ORZ

我記得我剛開始在學陣列的時候
我常常會寫這樣
Objec[] obj= new Object[]();
舉手問老師之後
老師也只會跟我說:就你寫法不對
原因?就寫法不對阿ORZ
如果真有甚麼其他原因的話
也麻煩各位大德互相幫忙了~


layolayo2002 edited on 2018-04-23 05:24
reply to postreply to post
作者 Re:宣告陣列中使用泛型類別語法的問題 [Re:layolayo2002]
喵太桑





發文: 6
積分: 0
於 2018-04-23 06:20 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
@layolayo2002

不好意思 不太懂你的意思 我照你的意思打出來這樣跟您的本意相同嗎?
還是我誤會您的意思了?


reply to postreply to post
By Billy
作者 Re:宣告陣列中使用泛型類別語法的問題 [Re:weberhwang]
喵太桑





發文: 6
積分: 0
於 2018-04-23 06:31 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
@weberhwang

//13行我是想做成2維,第1個維度是固定10個元素,第2個維度是ArrayList<String>可變動,但13行的語法有誤,不知為何?

array是無法固定的 你就算設定[10] 你給他第十一個add一樣會有11個 String[10]才可以固定
要達到此目的可以另加if去判斷大小 達到10之後就不加

建議只需要 ArrayList<String> a = new ArrayList<>(); 即可


reply to postreply to post
By Billy
作者 Re:宣告陣列中使用泛型類別語法的問題 [Re:weberhwang]
sir_ap





發文: 93
積分: 0
於 2018-04-23 07:52 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
java 的 Arrays 無法宣告參數化型別,
請參考
https://stackoverflow.com/questions/2927391/whats-the-reason-i-cant-create-generic-array-types-in-java

泛型就是想在編譯時期可以先判斷出臭蟲,若是可以:
// 擷取自java tutorial
Object[] stringLists = new List<String>[]; // compiler error, but pretend it's allowed
stringLists[0] = new ArrayList<String>(); // OK
stringLists[1] = new ArrayList<Integer>(); // An ArrayStoreException should be thrown,
// but the runtime can't detect it.
應該發生的錯誤卻沒在開始捕捉到...
以上供您參考。


reply to postreply to post
作者 Re:宣告陣列中使用泛型類別語法的問題 [Re:喵太桑]
layolayo2002





發文: 40
積分: 0
於 2018-04-23 07:57 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
你誤會了....

我的宣告長這樣...

1
   ArrayList<String>[] a = new ArrayList[10];


layolayo2002 edited on 2018-04-23 09:34
reply to postreply to post
作者 Re:宣告陣列中使用泛型類別語法的問題 [Re:layolayo2002]
喵太桑





發文: 6
積分: 0
於 2018-04-23 08:33 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
這樣還是不能編譯過阿?


reply to postreply to post
By Billy
作者 Re:宣告陣列中使用泛型類別語法的問題 [Re:喵太桑]
layolayo2002





發文: 40
積分: 0
於 2018-04-23 09:34 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
.....
我眼殘
是這個才對
1
ArrayList<String>[] a = new ArrayList[10]; 


reply to postreply to post
作者 Re:宣告陣列中使用泛型類別語法的問題 [Re:sir_ap]
weberhwang





發文: 45
積分: 0
於 2018-04-23 09:41 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
sir_ap 大大的例子
我看了還是有點不懂,可能我理解力不太好。
1
2
Object[] stringLists = new List<String>[]; //編譯上過不了,但假設它會過,所以下面這行在執行時期就會出錯。
stringLists[1] = new ArrayList<Integer>(); //這樣的效果不是我們想要的,我們想要在編譯時期就知道有問題。


至於我的例子 ArrayList<String>[] c = new ArrayList<String>[10]; ,
ArrayList<String>,並不是Object
不是已經有明確指定要放入什麼類型物件了
為何在編譯期還是不能使用這樣的語法?<< 我的疑問點

不過若是sir_ap大大說...Java已經明確說明Arrays不能使用參數化型別的話@@,那我就當規則來背了。

感謝幾位先進的指點。


reply to postreply to post
» JWorld@TW »  Java SE 討論區

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8