9
9
package scala
10
10
package reflect
11
11
12
- import scala .collection .mutable .{ ArrayBuilder , WrappedArray }
12
+ import scala .collection .mutable .{ArrayBuilder , WrappedArray }
13
13
14
14
/** A `Manifest[T]` is an opaque descriptor for type T. Its supported use
15
15
* is to give access to the erasure of the type as a `Class` instance, as
@@ -21,23 +21,22 @@ import scala.collection.mutable.{ ArrayBuilder, WrappedArray }
21
21
* which are not yet adequately represented in manifests.
22
22
*
23
23
* Example usages:
24
- {{{
25
- def arr[T] = new Array[T](0) // does not compile
26
- def arr[T](implicit m: Manifest[T]) = new Array[T](0) // compiles
27
- def arr[T: Manifest] = new Array[T](0) // shorthand for the preceding
28
-
29
- // Methods manifest, classManifest, and optManifest are in [[scala.Predef ]].
30
- def isApproxSubType[T: Manifest, U: Manifest] = manifest[T] <:< manifest[U]
31
- isApproxSubType[List[String], List[AnyRef]] // true
32
- isApproxSubType[List[String], List[Int]] // false
33
-
34
- def methods[T: ClassManifest] = classManifest[T].erasure.getMethods
35
- def retType[T: ClassManifest](name: String) =
36
- methods[T] find (_.getName == name) map (_.getGenericReturnType)
37
-
38
- retType[Map[_, _]]("values") // Some(scala.collection.Iterable<B>)
39
- }}}
24
+ * {{{
25
+ * def arr[T] = new Array[T](0) // does not compile
26
+ * def arr[T](implicit m: Manifest[T]) = new Array[T](0) // compiles
27
+ * def arr[T: Manifest] = new Array[T](0) // shorthand for the preceding
40
28
*
29
+ * // Methods manifest, classManifest, and optManifest are in [[scala.Predef ]].
30
+ * def isApproxSubType[T: Manifest, U: Manifest] = manifest[T] <:< manifest[U]
31
+ * isApproxSubType[List[String], List[AnyRef]] // true
32
+ * isApproxSubType[List[String], List[Int]] // false
33
+ *
34
+ * def methods[T: ClassManifest] = classManifest[T].erasure.getMethods
35
+ * def retType[T: ClassManifest](name: String) =
36
+ * methods[T] find (_.getName == name) map (_.getGenericReturnType)
37
+ *
38
+ * retType[Map[_, _]]("values") // Some(scala.collection.Iterable<B>)
39
+ * }}}
41
40
*/
42
41
@ scala.annotation.implicitNotFound(msg = " No Manifest available for ${T}." )
43
42
// TODO undeprecated until Scala reflection becomes non-experimental
@@ -88,71 +87,79 @@ object ManifestFactory {
88
87
def valueManifests : List [AnyValManifest [_]] =
89
88
List (Byte , Short , Char , Int , Long , Float , Double , Boolean , Unit )
90
89
91
- val Byte : AnyValManifest [ Byte ] = new AnyValManifest [scala.Byte ](" Byte" ) {
90
+ private class ByteManifest extends AnyValManifest [scala.Byte ](" Byte" ) {
92
91
def runtimeClass = java.lang.Byte .TYPE
93
92
override def newArray (len : Int ): Array [Byte ] = new Array [Byte ](len)
94
93
override def newWrappedArray (len : Int ): WrappedArray [Byte ] = new WrappedArray .ofByte(new Array [Byte ](len))
95
94
override def newArrayBuilder (): ArrayBuilder [Byte ] = new ArrayBuilder .ofByte()
96
95
private def readResolve (): Any = Manifest .Byte
97
96
}
97
+ val Byte : AnyValManifest [Byte ] = new ByteManifest
98
98
99
- val Short : AnyValManifest [ Short ] = new AnyValManifest [scala.Short ](" Short" ) {
99
+ private class ShortManifest extends AnyValManifest [scala.Short ](" Short" ) {
100
100
def runtimeClass = java.lang.Short .TYPE
101
101
override def newArray (len : Int ): Array [Short ] = new Array [Short ](len)
102
102
override def newWrappedArray (len : Int ): WrappedArray [Short ] = new WrappedArray .ofShort(new Array [Short ](len))
103
103
override def newArrayBuilder (): ArrayBuilder [Short ] = new ArrayBuilder .ofShort()
104
104
private def readResolve (): Any = Manifest .Short
105
105
}
106
+ val Short : AnyValManifest [Short ] = new ShortManifest
106
107
107
- val Char : AnyValManifest [ Char ] = new AnyValManifest [scala.Char ](" Char" ) {
108
+ private class CharManifest extends AnyValManifest [scala.Char ](" Char" ) {
108
109
def runtimeClass = java.lang.Character .TYPE
109
110
override def newArray (len : Int ): Array [Char ] = new Array [Char ](len)
110
111
override def newWrappedArray (len : Int ): WrappedArray [Char ] = new WrappedArray .ofChar(new Array [Char ](len))
111
112
override def newArrayBuilder (): ArrayBuilder [Char ] = new ArrayBuilder .ofChar()
112
113
private def readResolve (): Any = Manifest .Char
113
114
}
115
+ val Char : AnyValManifest [Char ] = new CharManifest
114
116
115
- val Int : AnyValManifest [ Int ] = new AnyValManifest [scala.Int ](" Int" ) {
117
+ private class IntManifest extends AnyValManifest [scala.Int ](" Int" ) {
116
118
def runtimeClass = java.lang.Integer .TYPE
117
119
override def newArray (len : Int ): Array [Int ] = new Array [Int ](len)
118
120
override def newWrappedArray (len : Int ): WrappedArray [Int ] = new WrappedArray .ofInt(new Array [Int ](len))
119
121
override def newArrayBuilder (): ArrayBuilder [Int ] = new ArrayBuilder .ofInt()
120
122
private def readResolve (): Any = Manifest .Int
121
123
}
124
+ val Int : AnyValManifest [Int ] = new IntManifest
122
125
123
- val Long : AnyValManifest [ Long ] = new AnyValManifest [scala.Long ](" Long" ) {
126
+ private class LongManifest extends AnyValManifest [scala.Long ](" Long" ) {
124
127
def runtimeClass = java.lang.Long .TYPE
125
128
override def newArray (len : Int ): Array [Long ] = new Array [Long ](len)
126
129
override def newWrappedArray (len : Int ): WrappedArray [Long ] = new WrappedArray .ofLong(new Array [Long ](len))
127
130
override def newArrayBuilder (): ArrayBuilder [Long ] = new ArrayBuilder .ofLong()
128
131
private def readResolve (): Any = Manifest .Long
129
132
}
133
+ val Long : AnyValManifest [Long ] = new LongManifest
130
134
131
- val Float : AnyValManifest [ Float ] = new AnyValManifest [scala.Float ](" Float" ) {
135
+ private class FloatManifest extends AnyValManifest [scala.Float ](" Float" ) {
132
136
def runtimeClass = java.lang.Float .TYPE
133
137
override def newArray (len : Int ): Array [Float ] = new Array [Float ](len)
134
138
override def newWrappedArray (len : Int ): WrappedArray [Float ] = new WrappedArray .ofFloat(new Array [Float ](len))
135
139
override def newArrayBuilder (): ArrayBuilder [Float ] = new ArrayBuilder .ofFloat()
136
140
private def readResolve (): Any = Manifest .Float
137
141
}
142
+ val Float : AnyValManifest [Float ] = new FloatManifest
138
143
139
- val Double : AnyValManifest [ Double ] = new AnyValManifest [scala.Double ](" Double" ) {
144
+ private class DoubleManifest extends AnyValManifest [scala.Double ](" Double" ) {
140
145
def runtimeClass = java.lang.Double .TYPE
141
146
override def newArray (len : Int ): Array [Double ] = new Array [Double ](len)
142
147
override def newWrappedArray (len : Int ): WrappedArray [Double ] = new WrappedArray .ofDouble(new Array [Double ](len))
143
148
override def newArrayBuilder (): ArrayBuilder [Double ] = new ArrayBuilder .ofDouble()
144
149
private def readResolve (): Any = Manifest .Double
145
150
}
151
+ val Double : AnyValManifest [Double ] = new DoubleManifest
146
152
147
- val Boolean : AnyValManifest [ Boolean ] = new AnyValManifest [scala.Boolean ](" Boolean" ) {
153
+ private class BooleanManifest extends AnyValManifest [scala.Boolean ](" Boolean" ) {
148
154
def runtimeClass = java.lang.Boolean .TYPE
149
155
override def newArray (len : Int ): Array [Boolean ] = new Array [Boolean ](len)
150
156
override def newWrappedArray (len : Int ): WrappedArray [Boolean ] = new WrappedArray .ofBoolean(new Array [Boolean ](len))
151
157
override def newArrayBuilder (): ArrayBuilder [Boolean ] = new ArrayBuilder .ofBoolean()
152
158
private def readResolve (): Any = Manifest .Boolean
153
159
}
160
+ val Boolean : AnyValManifest [Boolean ] = new BooleanManifest
154
161
155
- val Unit : AnyValManifest [ Unit ] = new AnyValManifest [scala.Unit ](" Unit" ) {
162
+ private class UnitManifest extends AnyValManifest [scala.Unit ](" Unit" ) {
156
163
def runtimeClass = java.lang.Void .TYPE
157
164
override def newArray (len : Int ): Array [Unit ] = new Array [Unit ](len)
158
165
override def newWrappedArray (len : Int ): WrappedArray [Unit ] = new WrappedArray .ofUnit(new Array [Unit ](len))
@@ -162,43 +169,49 @@ object ManifestFactory {
162
169
else super .arrayClass(tp)
163
170
private def readResolve (): Any = Manifest .Unit
164
171
}
172
+ val Unit : AnyValManifest [Unit ] = new UnitManifest
165
173
166
174
private val ObjectTYPE = classOf [java.lang.Object ]
167
175
private val NothingTYPE = classOf [scala.runtime.Nothing $]
168
176
private val NullTYPE = classOf [scala.runtime.Null $]
169
177
170
- val Any : Manifest [scala. Any ] = new PhantomManifest [scala.Any ](ObjectTYPE , " Any" ) {
178
+ private class AnyManifest extends PhantomManifest [scala.Any ](ObjectTYPE , " Any" ) {
171
179
override def newArray (len : Int ) = new Array [scala.Any ](len)
172
180
override def <:< (that : ClassManifest [_]): Boolean = (that eq this )
173
181
private def readResolve (): Any = Manifest .Any
174
182
}
183
+ val Any : Manifest [scala.Any ] = new AnyManifest
175
184
176
- val Object : Manifest [java.lang. Object ] = new PhantomManifest [java.lang.Object ](ObjectTYPE , " Object" ) {
185
+ private class ObjectManifest extends PhantomManifest [java.lang.Object ](ObjectTYPE , " Object" ) {
177
186
override def newArray (len : Int ) = new Array [java.lang.Object ](len)
178
187
override def <:< (that : ClassManifest [_]): Boolean = (that eq this ) || (that eq Any )
179
188
private def readResolve (): Any = Manifest .Object
180
189
}
190
+ val Object : Manifest [java.lang.Object ] = new ObjectManifest
181
191
182
192
val AnyRef : Manifest [scala.AnyRef ] = Object .asInstanceOf [Manifest [scala.AnyRef ]]
183
193
184
- val AnyVal : Manifest [scala. AnyVal ] = new PhantomManifest [scala.AnyVal ](ObjectTYPE , " AnyVal" ) {
194
+ private class AnyValPhantomManifest extends PhantomManifest [scala.AnyVal ](ObjectTYPE , " AnyVal" ) {
185
195
override def newArray (len : Int ) = new Array [scala.AnyVal ](len)
186
196
override def <:< (that : ClassManifest [_]): Boolean = (that eq this ) || (that eq Any )
187
197
private def readResolve (): Any = Manifest .AnyVal
188
198
}
199
+ val AnyVal : Manifest [scala.AnyVal ] = new AnyValPhantomManifest
189
200
190
- val Null : Manifest [scala. Null ] = new PhantomManifest [scala.Null ](NullTYPE , " Null" ) {
201
+ private class NullManifest extends PhantomManifest [scala.Null ](NullTYPE , " Null" ) {
191
202
override def newArray (len : Int ) = new Array [scala.Null ](len)
192
203
override def <:< (that : ClassManifest [_]): Boolean =
193
204
(that ne null ) && (that ne Nothing ) && ! (that <:< AnyVal )
194
205
private def readResolve (): Any = Manifest .Null
195
206
}
207
+ val Null : Manifest [scala.Null ] = new NullManifest
196
208
197
- val Nothing : Manifest [scala. Nothing ] = new PhantomManifest [scala.Nothing ](NothingTYPE , " Nothing" ) {
209
+ private class NothingManifest extends PhantomManifest [scala.Nothing ](NothingTYPE , " Nothing" ) {
198
210
override def newArray (len : Int ) = new Array [scala.Nothing ](len)
199
211
override def <:< (that : ClassManifest [_]): Boolean = (that ne null )
200
212
private def readResolve (): Any = Manifest .Nothing
201
213
}
214
+ val Nothing : Manifest [scala.Nothing ] = new NothingManifest
202
215
203
216
private class SingletonTypeManifest [T <: AnyRef ](value : AnyRef ) extends Manifest [T ] {
204
217
lazy val runtimeClass = value.getClass
@@ -251,31 +264,37 @@ object ManifestFactory {
251
264
def arrayType [T ](arg : Manifest [_]): Manifest [Array [T ]] =
252
265
arg.asInstanceOf [Manifest [T ]].arrayManifest
253
266
267
+ private class AbstractTypeManifest [T ](prefix : Manifest [_], name : String , upperBound : Predef .Class [_], args : Seq [Manifest [_]]) extends Manifest [T ] {
268
+ def runtimeClass = upperBound
269
+ override val typeArguments = args.toList
270
+ override def toString = prefix.toString+ " #" + name+ argString
271
+ }
272
+
254
273
/** Manifest for the abstract type `prefix # name`. `upperBound` is not
255
274
* strictly necessary as it could be obtained by reflection. It was
256
275
* added so that erasure can be calculated without reflection. */
257
276
def abstractType [T ](prefix : Manifest [_], name : String , upperBound : Predef .Class [_], args : Manifest [_]* ): Manifest [T ] =
258
- new Manifest [T ] {
259
- def runtimeClass = upperBound
260
- override val typeArguments = args.toList
261
- override def toString = prefix.toString+ " #" + name+ argString
262
- }
277
+ new AbstractTypeManifest [T ](prefix, name, upperBound, args)
278
+
279
+ private class WildcardManifest [T ](lowerBound : Manifest [_], upperBound : Manifest [_]) extends Manifest [T ] {
280
+ def runtimeClass = upperBound.runtimeClass
281
+ override def toString =
282
+ " _" +
283
+ (if (lowerBound eq Nothing ) " " else " >: " + lowerBound) +
284
+ (if (upperBound eq Nothing ) " " else " <: " + upperBound)
285
+ }
263
286
264
287
/** Manifest for the unknown type `_ >: L <: U` in an existential.
265
288
*/
266
289
def wildcardType [T ](lowerBound : Manifest [_], upperBound : Manifest [_]): Manifest [T ] =
267
- new Manifest [T ] {
268
- def runtimeClass = upperBound.runtimeClass
269
- override def toString =
270
- " _" +
271
- (if (lowerBound eq Nothing ) " " else " >: " + lowerBound) +
272
- (if (upperBound eq Nothing ) " " else " <: " + upperBound)
273
- }
290
+ new WildcardManifest [T ](lowerBound, upperBound)
291
+
292
+ private class IntersectionTypeManifest [T ](parents : Seq [Manifest [_]]) extends Manifest [T ] {
293
+ def runtimeClass = parents.head.runtimeClass
294
+ override def toString = parents.mkString(" with " )
295
+ }
274
296
275
297
/** Manifest for the intersection type `parents_0 with ... with parents_n`. */
276
298
def intersectionType [T ](parents : Manifest [_]* ): Manifest [T ] =
277
- new Manifest [T ] {
278
- def runtimeClass = parents.head.runtimeClass
279
- override def toString = parents.mkString(" with " )
280
- }
299
+ new IntersectionTypeManifest [T ](parents)
281
300
}
0 commit comments