回答編集履歴
1
型引数に指定した具象型を得るための条件(A)を訂正
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)`と
|
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
|
-
としても、cla
|
45
|
+
としても、clazzが`MutableSet`を継承する具象クラスであることはわかるのですが、その具象クラスの型引数に何の型が指定されていたかまではわからない仕様になっています。
|
40
46
|
|
41
47
|
|
42
48
|
|
@@ -44,7 +50,7 @@
|
|
44
50
|
|
45
51
|
|
46
52
|
|
47
|
-
A) 「型引数
|
53
|
+
A) 「型引数に具象型を指定したGenericsを継承したクラスを定義し、そのクラス情報からsuperclassとして参照したときのTypeからしか型引数がわからない」(__訂正:元の説明には余計な条件を含んでいましたので記述を改めました__)
|
48
54
|
|
49
55
|
|
50
56
|
|
@@ -58,15 +64,15 @@
|
|
58
64
|
|
59
65
|
...
|
60
66
|
|
61
|
-
val
|
67
|
+
val typeOfSuperA = MutableSetOfLong::class.supertypes[0]
|
62
68
|
|
63
|
-
a.java
|
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の制約のため
|
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
|
|