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

» JWorld@TW » Java SE 討論區  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友   
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 宣告泛型類別時不可以使用已存在的類別做為代號的問題
weberhwang





發文: 41
積分: 0
於 2019-02-26 20:44 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,下面例子中,為何將★那行註解掉,compile就會過?
1
2
3
4
5
6
7
8
9
10
11
//有一個類別A
class A { }
 
//宣告一個泛型類別Car,本來應該要用Car<T>的方式,但卻用成Car<A>,
//而A是實際存在的類別,故compile過不了是正常,
//但很奇怪的是,若把我 ★ 那行註解掉,compile就會過?這是為何?
public class Car2<A> {
  public static void main(String[] args){
    A a = new A(); //★
  }
}


問題2
1
2
3
4
5
6
7
//假如有一個叫Car的泛型類別
class Car<T,S>{ }
 
//這時另做了一個Tank類別去繼承Car,但卻把Car<T,S>寫成Car<B, B>卻仍能compile過,
//照說對Car而言兩個代號不是應該要不同的嗎?為何這樣會可以compile呢?如下
class Tank<A,B,C> extends Car<B,B>{ }
 


weberhwang edited on 2019-02-26 20:58
reply to postreply to post
作者 Re:宣告泛型類別時不可以使用已存在的類別做為代號的問題 [Re:weberhwang]
kentyeh





發文: 641
積分: 6
於 2019-02-27 09:38 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的Gerenic實際上是syntactic sugar,
所以在Compile階段根本不知道 A 是什麼,
重點是Java跟C一樣是 statically typed language
所以理解上根本不知道要如何將 A instantiate

第二個問題
宣告Car的時候根本不知是T與S是那種Type,
所以 T=B,S=B也沒什麼問題,只能說
在Tank的繼承的Car,T與S是必須是B而以


reply to postreply to post
作者 Re:宣告泛型類別時不可以使用已存在的類別做為代號的問題 [Re:kentyeh]
clock

小時候在看國外測試機器人的影片



發文: 65
積分: 0
於 2019-02-27 17:09 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
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class Input<T, E, F> {
 
    private final T c1;
    private final E c2;
    private final F c3;
 
    public Input(T c1, E c2, F c3) {
        this.c1 = c1;
        this.c2 = c2;
        this.c3 = c3;
    }
 
    public void printC1() {
        System.out.println("c1:" + c1.getClass() + "");
    }
 
    public void printC2() {
        System.out.println("c2:" + c2.getClass() + "");
    }
 
    public void printC3() {
        System.out.println("c3:" + c3.getClass() + "Data.toString:"+c3.toString());
    }
 
    public static void main(String[] args) {
        Input table = new Input(1, "clock", new Data("a001",1000000));<===在實體化時依照傳入的參數決定變數型別 
        table.printC1();
        table.printC2();
        table.printC3();
    }
}


output:
c1:class java.lang.Integer
c2:class java.lang.String
c3:class generic.DataData.toStringBig Smileata{id=a001, balance=1000000}


reply to postreply to post
c:你好像很喜歡研究機械產品
X:我從小就跟博士做研究
c:哪位博士
X:南宮博士
作者 Re:宣告泛型類別時不可以使用已存在的類別做為代號的問題 [Re:kentyeh]
weberhwang





發文: 41
積分: 0
於 2019-02-27 19:53 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
//有一個類別A
class A { }
 
//宣告一個泛型類別Car,本來應該要用Car<T>的方式,但卻用成Car<A>,
//而A是實際存在的類別,故compile過不了是正常,
//但很奇怪的是,若把我 ★ 那行註解掉,compile就會過?這是為何?
public class Car2<A> {
  public static void main(String[] args){
    A a = new A(); //★
  }
}

以上面這例子而言,我自己的認知是「在宣告泛型類別時,不可以用 已存在的類別 做為 < > 裡面的代號」
例如,假如已存在一個叫Car的類別
那就想另外宣告一個TestCar的泛型類別時,就不能寫public class TestCar<Car>{.....}
必須寫成public class TestCar<X> {...} (X是一個不存在的類別,故可以拿來當代號)
上面這個認知不知是否有誤?

假如沒錯的話,接下來的問題就是,A是已存在的類別
public class Car2<A>{ ←光是這樣寫不就「應該」compile不過才對嗎? 為何反而註解掉★那行就能過了?這點就違返了我第一點的認知…還是搞不懂

}

第二個問題
1
2
3
4
5
6
//假如有一個叫Car的泛型類別
class Car<T,S>{ }
 
//這時另做了一個Tank類別去繼承Car,但卻把Car<T,S>寫成Car<B, B>卻仍能compile過,
//照說對Car而言兩個代號不是應該要不同的嗎?為何這樣會可以compile呢?如下
class Tank<A,B,C> extends Car<B,B>{ }


因為如大大說的,宣告類別時,T、S在之後實例化時,會是什麼,它目前不知道。
這時我就覺得,那不就直接寫class Car<T,T>就好了
但寫這樣卻compile又過不了,那到底視<T,T>為不合法,而視<T,S>為合法的理由又是為何?

甚至class Tank<A,B,C> extends Car<B,B>{ } 改成 class Tank<T,T,T> extends Car<T,T>{ }(←不合法的寫法) 但 差別又在那?因為總會說 現在又不確定它將來實例化會是放入什麼類別 syntactic sugar的效果 (<>會被擦掉)
那到底要區分代號有什麼「必要性」或「優點」我實在看不出來,
目前只知道 泛型類別在實例化時 會有檢核的功能,但在宣告泛型類別當下,這些代號有什麼檢核效果嗎?


weberhwang edited on 2019-02-27 20:00
reply to postreply to post
作者 Re:宣告泛型類別時不可以使用已存在的類別做為代號的問題 [Re:weberhwang]
kentyeh





發文: 641
積分: 6
於 2019-03-01 09:50 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
第一個問題
Class A 與 Car2< A> 中的兩個A是不一樣的
第一個 A 是類別,第2個A是泛型(也就是宣告成 T 也無妨),兩者沒有關聯性,除非你的Card2是這樣宣告
1
Car2<T extends A>
,明確規範泛型 T 必須繼承 A Class,
之前為什麼說 Java 的泛型是 syntactic sugar,
你只要找個反組譯器,反解 Car2的 class為 java code,你就會發現泛型都不見了,
也就是說泛型只在 compile 階段作為 強制檢查,實際上在執行階段根本不知段泛型是什麼
第二個問題
1
class Car<T,S>{ }

1
class Car<T,T>{ }
有什麼不一樣,
第一個<T,S>表示泛型 T與S可以是相同型別,也可以是不相同型別
至於<T,T> 表是只能有一種泛型 T,不可能出現不同的型別,既然相同,只要宣告一個即可
1
class Car<T>{ }


reply to postreply to post
作者 Re:宣告泛型類別時不可以使用已存在的類別做為代號的問題 [Re:kentyeh]
javaX





發文: 188
積分: 0
於 2019-03-01 14: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
所以泛型是類別裡的
變數在設計時沒有先決定型別
由實體化時再決定

而class Car<T,S> 是說明
Car 類別在設計時有
兩個型別的變數

但實際上還是以實體化後決定


javaX edited on 2019-03-01 14:50
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