回答編集履歴

1

型引数に指定した具象型を得るための条件(A)を訂正

2018/11/16 14:21

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -1,14 +1,20 @@
1
+ 訂正: 型引数に指定した具象型を得るための条件(A)が不適切だったので訂正しました。また若干の誤記を訂正しました。
2
+
3
+
4
+
5
+ ---
6
+
1
7
  KotlinにせよJavaにせよメソッドの引数に指定できるのは「値」です。しかし「型名」は文法上特別な意味を持つ構文要素でしてそれは「値」にはなれません。型が指定できる特別な場所にしか書けないのです。
2
8
 
3
9
 
4
10
 
5
11
  `val a: Int`とか`class MyClass : MutableSet<Long> ...`とはかけますが、
6
12
 
7
- `val a = Int`とか`somFunction(Int)`と書けません。`Int`は型名であって「値」ではないからです。
13
+ `val a = Int`とか`someFunction(Int)`と書けません。`Int`は型名であって「値」ではないからです。
8
14
 
9
15
 
10
16
 
11
- そこで型に関する情報を「値としてやりとりする」ために登場するのがjava.lang.Class, kotlin.reflect.KClass, java.lang.reflect.Typeなどの型のメタ情報を保持するメタクラスです。
17
+ そこで型に関する情報を「値としてやりとりする」ために登場するのがjava.lang.Class, kotlin.reflect.KClass, java.lang.reflect.Typeなどの型のメタ情報を保持するクラス(メタクラス)です。
12
18
 
13
19
 
14
20
 
@@ -26,7 +32,7 @@
26
32
 
27
33
 
28
34
 
29
- ```
35
+ ```kotlin
30
36
 
31
37
  val o = mutableSetOf(1L, 2L)
32
38
 
@@ -36,7 +42,7 @@
36
42
 
37
43
 
38
44
 
39
- としても、classには`MutableSet`を継承する具象クラスはわかるのですが、その具象クラスの型引数に何の型が指定されていたかまではわからない仕様になっています。
45
+ としても、clazzが`MutableSet`を継承する具象クラスであることはわかるのですが、その具象クラスの型引数に何の型が指定されていたかまではわからない仕様になっています。
40
46
 
41
47
 
42
48
 
@@ -44,7 +50,7 @@
44
50
 
45
51
 
46
52
 
47
- A) 「型引数が明示されたGenericsを継承したクラスを定義し、そのインスタンスのクラス情報からsuperclassとして参照したときのTypeからしか型引数がわからない」
53
+ A) 「型引数に具象型を指定したGenericsを継承したクラスを定義し、そのクラス情報からsuperclassとして参照したときのTypeからしか型引数がわからない」(__訂正:元の説明には余計な条件を含んでいましたので記述を改めました__)
48
54
 
49
55
 
50
56
 
@@ -58,15 +64,15 @@
58
64
 
59
65
  ...
60
66
 
61
- val a = A()
67
+ val typeOfSuperA = MutableSetOfLong::class.supertypes[0]
62
68
 
63
- a.javaClass <=このインスタンスのクラスのsuperクラスにしか型引数の情報がない
69
+ println(typeOfSuperA) // ==> kotlin.collections.HashSet<kotlin.Long> /* = java.util.HashSet<kotlin.Long> */
64
70
 
65
71
  ```
66
72
 
67
73
 
68
74
 
69
- gsonで用意されているTypeTokenはそのままではAの制約のため期待通りのtype参照できません。正しくはTypeTokenの派生クラスを定義しそのインスタンスを生成してそれのtypeを参照しなくてはならないのです。そういう事情があるためTypeTokenは直接インスタンスを生成できないよう「コンストラクターがprotectedになっている」のです。
75
+ gsonで用意されているTypeTokenはそのままではAの制約のためtype参照しても期待通りの内容になってません。正しくはTypeTokenの派生クラスを定義しそのtypeを参照しなくてはならないのです。そういう事情があるためTypeTokenは直接インスタンスを生成できないよう「コンストラクターがprotectedになっている」のです。
70
76
 
71
77
 
72
78
 
@@ -78,7 +84,7 @@
78
84
 
79
85
 
80
86
 
81
- 結局どう書けばよいかといえば、TypeTokenの派生クラスを定義してインスタンスを生成すればいのですが、そには無名クラスのインスタンス化の構文を使うのが一番簡潔です。
87
+ 結局どう書けばよいかといえば、TypeTokenの派生クラスを定義すればいのですが、そうしたもの一々名前を付けるの煩雑なので、無名クラスのインスタンス化の構文を使うのが一番簡潔です。
82
88
 
83
89
 
84
90