4
4
*/
5
5
package org .hibernate .type .descriptor .converter .internal ;
6
6
7
- import java .lang .reflect .Array ;
8
7
import java .util .Collection ;
9
8
10
9
import org .hibernate .internal .build .AllowReflection ;
11
10
import org .hibernate .type .descriptor .converter .spi .BasicValueConverter ;
12
11
import org .hibernate .type .descriptor .java .JavaType ;
13
12
import org .hibernate .type .descriptor .java .spi .BasicCollectionJavaType ;
14
13
14
+ import static java .lang .reflect .Array .newInstance ;
15
+
15
16
/**
16
17
* Handles conversion to/from a collection of a converted element type.
17
18
*/
18
- public class CollectionConverter <X extends Collection <Object >, Y > implements BasicValueConverter <X , Y > {
19
+ public class CollectionConverter <X extends Collection <E >, E , R > implements BasicValueConverter <X , R [] > {
19
20
20
- private final BasicValueConverter <Object , Object > elementConverter ;
21
+ private final BasicValueConverter <E , R > elementConverter ;
21
22
private final BasicCollectionJavaType <X , ?> domainJavaType ;
22
- private final JavaType <Y > relationalJavaType ;
23
+ private final JavaType <R [] > relationalJavaType ;
23
24
24
25
public CollectionConverter (
25
- BasicValueConverter <Object , Object > elementConverter ,
26
- BasicCollectionJavaType <X , ? > domainJavaType ,
27
- JavaType <Y > relationalJavaType ) {
26
+ BasicValueConverter <E , R > elementConverter ,
27
+ BasicCollectionJavaType <X , E > domainJavaType ,
28
+ JavaType <R [] > relationalJavaType ) {
28
29
this .elementConverter = elementConverter ;
29
30
this .domainJavaType = domainJavaType ;
30
31
this .relationalJavaType = relationalJavaType ;
31
32
}
32
33
33
34
@ Override
34
- public X toDomainValue (Y relationalForm ) {
35
+ public X toDomainValue (R [] relationalForm ) {
35
36
if ( relationalForm == null ) {
36
37
return null ;
37
38
}
38
- final Object [] relationalArray = (Object []) relationalForm ;
39
- final X domainForm = domainJavaType .getSemantics ().instantiateRaw ( relationalArray .length , null );
40
- for ( int i = 0 ; i < relationalArray .length ; i ++ ) {
41
- domainForm .add ( elementConverter .toDomainValue ( relationalArray [i ] ) );
39
+ final X domainForm =
40
+ domainJavaType .getSemantics ()
41
+ .instantiateRaw ( relationalForm .length , null );
42
+ for ( R r : relationalForm ) {
43
+ domainForm .add ( elementConverter .toDomainValue ( r ) );
42
44
}
43
45
return domainForm ;
44
46
}
45
47
46
48
@ Override
47
- @ AllowReflection
48
- public Y toRelationalValue (X domainForm ) {
49
+ public R [] toRelationalValue (X domainForm ) {
49
50
if ( domainForm == null ) {
50
51
return null ;
51
52
}
52
- final Object [] relationalArray = (Object []) Array .newInstance (
53
- elementConverter .getRelationalJavaType ().getJavaTypeClass (),
54
- domainForm .size ()
55
- );
53
+ final R [] relationalArray = newRelationalArray ( domainForm .size () );
56
54
int i = 0 ;
57
- for ( Object domainValue : domainForm ) {
55
+ for ( var domainValue : domainForm ) {
58
56
relationalArray [i ++] = elementConverter .toRelationalValue ( domainValue );
59
57
}
58
+ return relationalArray ;
59
+ }
60
+
61
+ @ AllowReflection
62
+ private R [] newRelationalArray (int size ) {
63
+ final Object result = newInstance ( elementConverter .getRelationalJavaType ().getJavaTypeClass (), size );
60
64
//noinspection unchecked
61
- return (Y ) relationalArray ;
65
+ return (R []) result ;
62
66
}
63
67
64
68
@ Override
@@ -67,7 +71,7 @@ public JavaType<X> getDomainJavaType() {
67
71
}
68
72
69
73
@ Override
70
- public JavaType <Y > getRelationalJavaType () {
74
+ public JavaType <R [] > getRelationalJavaType () {
71
75
return relationalJavaType ;
72
76
}
73
77
0 commit comments