teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

append

2016/10/14 01:44

投稿

yohhoy
yohhoy

スコア6191

answer CHANGED
@@ -19,3 +19,5 @@
19
19
  この説明では「`new String("ABC")`に渡している引数`"ABC"`の型は何なのか?」というギモンが生まれ、「引数をとるコンストラクタでは各引数の型宣言を行う」仕様との整合性の観点で破綻しています。もちろん「疑似プリミティブ型は特別なのだ」や「ソースコード上の`"ABC"`という表記は第三の謎型を持ち、`String`型はそれを受け取って初期化できるのだ」というこじつけ説明は可能ですが、そのような謎かけ説明をするくらいなら「`String`型もまた参照型である/文字列は良く使う機能なので特別扱いされる」というシンプルな説明が好ましいと考えます。
20
20
 
21
21
  また、`String`型の振る舞いは**本質的**に参照型であるにもかかわらず、疑似プリミティブ型という語によりプリミティブ型の一種と誤解されるリスクが高い点もマイナス要素と考えます。
22
+
23
+ [Keep it simple, stupid!](https://ja.wikipedia.org/wiki/KISS%E3%81%AE%E5%8E%9F%E5%89%87)

3

update

2016/10/14 01:44

投稿

yohhoy
yohhoy

スコア6191

answer CHANGED
@@ -16,4 +16,6 @@
16
16
  int v = 42; // プリミティブ型と同じようにね
17
17
  ```
18
18
 
19
- この説明では「`new String("ABC")`に渡している引数`"ABC"`の型は何なのか?」というギモンが生まれ、「引数をとるコンストラクタでは各引数の型宣言を行う」仕様との整合性の観点で破綻しています。もちろん「ソースコード上の`"ABC"`という表記は第三の謎型を持ち、`String`型はそれを受け取って初期化できるのだ」というこじつけ説明は可能ですが、そのような謎かけ説明をするくらいなら「`String`型もまた参照型である/文字列は良く使う機能なので特別扱いされる」というシンプルな説明が好ましいと考えます。
19
+ この説明では「`new String("ABC")`に渡している引数`"ABC"`の型は何なのか?」というギモンが生まれ、「引数をとるコンストラクタでは各引数の型宣言を行う」仕様との整合性の観点で破綻しています。もちろん「疑似プリミティブ型は特別なのだ」や「ソースコード上の`"ABC"`という表記は第三の謎型を持ち、`String`型はそれを受け取って初期化できるのだ」というこじつけ説明は可能ですが、そのような謎かけ説明をするくらいなら「`String`型もまた参照型である/文字列は良く使う機能なので特別扱いされる」というシンプルな説明が好ましいと考えます。
20
+
21
+ また、`String`型の振る舞いは**本質的**に参照型であるにもかかわらず、疑似プリミティブ型という語によりプリミティブ型の一種と誤解されるリスクが高い点もマイナス要素と考えます。

2

append

2016/10/14 01:33

投稿

yohhoy
yohhoy

スコア6191

answer CHANGED
@@ -2,4 +2,18 @@
2
2
 
3
3
  英語圏で対応する(と思われる)"pseudo primitive type" で検索してみたところ、数は少ないもののいくつか使用例があるようです。いくつか眺めた傾向としては`String`型や文字列リテラルがコンパイラに特別扱いされること、オートボクシングを伴う`Integer`や`Double`などのプリミティブ型ラッパークラスを指すケース、`int[]`のような配列型(何故??)を指すレアケースがあるようです。
4
4
 
5
- 個人的には「疑似プリミティブ型」が広く普及した名称とは思えませんし、説明において無用にオレオレ概念を導入すべきではないと考えます。
5
+ 個人的には「疑似プリミティブ型」が広く普及した名称とは思えませんし、説明において無用にオレオレ概念を導入すべきではないと考えます。
6
+
7
+ ---
8
+ ここから先は意地悪な(ひねくれた)解釈です。典型的な「`String`型は疑似プリミティブ型」論法は、下記のような説明でしょう。
9
+
10
+ ```Java
11
+ SomeClass a = new SomeClass(引数); // 普通のクラス(参照型)はこう書くよね
12
+
13
+ String s1 = new String("ABC"); // '疑似'プリミティブ型はこうも書けるけど...
14
+ String s0 = "ABC"; // 文字列リテラルを直接代入もできるよ!
15
+
16
+ int v = 42; // プリミティブ型と同じようにね
17
+ ```
18
+
19
+ この説明では「`new String("ABC")`に渡している引数`"ABC"`の型は何なのか?」というギモンが生まれ、「引数をとるコンストラクタでは各引数の型宣言を行う」仕様との整合性の観点で破綻しています。もちろん、「ソースコード上の`"ABC"`という表記は第三の謎型を持ち、`String`型はそれを受け取って初期化できるのだ」というこじつけ説明は可能ですが、そのような謎かけ説明をするくらいなら「`String`型もまた参照型である/文字列は良く使う機能なので特別扱いされる」というシンプルな説明が好ましいと考えます。

1

small fix

2016/10/14 01:28

投稿

yohhoy
yohhoy

スコア6191

answer CHANGED
@@ -1,5 +1,5 @@
1
1
  Javaの文脈で「疑似プリミティブ型」という単語は初耳でした。少なくとも厳密なJava言語仕様としては、そのような分類の型は存在しないはずです。
2
2
 
3
- 英語圏で対応する(と思われる)"pseudo primitive type" で検索してみたところ、数は少ないもののいくつか使用例があるようです。いくつか眺めた傾向としては`String`型や文字列リテラルがコンパイラに特別扱いされること、オートボクシングを伴う`Int`や`Double`などのプリミティブ型ラッパークラスを指すケース、`int[]`のような配列型(何故??)を指すレアケースがあるようです。
3
+ 英語圏で対応する(と思われる)"pseudo primitive type" で検索してみたところ、数は少ないもののいくつか使用例があるようです。いくつか眺めた傾向としては`String`型や文字列リテラルがコンパイラに特別扱いされること、オートボクシングを伴う`Integer`や`Double`などのプリミティブ型ラッパークラスを指すケース、`int[]`のような配列型(何故??)を指すレアケースがあるようです。
4
4
 
5
5
  個人的には「疑似プリミティブ型」が広く普及した名称とは思えませんし、説明において無用にオレオレ概念を導入すべきではないと考えます。