@@ -41,16 +41,15 @@ private SqlColumn(Builder builder) {
41
41
typeHandler = builder .typeHandler ;
42
42
}
43
43
44
- @ SuppressWarnings ("unchecked" )
45
- protected SqlColumn (SqlColumn <?> sqlColumn ) {
44
+ protected SqlColumn (SqlColumn <T > sqlColumn ) {
46
45
name = sqlColumn .name ;
47
46
table = sqlColumn .table ;
48
47
jdbcType = sqlColumn .jdbcType ;
49
48
isDescending = sqlColumn .isDescending ;
50
49
alias = sqlColumn .alias ;
51
50
typeHandler = sqlColumn .typeHandler ;
52
51
renderingStrategy = sqlColumn .renderingStrategy ;
53
- parameterTypeConverter = ( ParameterTypeConverter < T , ?>) sqlColumn .parameterTypeConverter ;
52
+ parameterTypeConverter = sqlColumn .parameterTypeConverter ;
54
53
}
55
54
56
55
public String name () {
@@ -119,25 +118,39 @@ public Optional<RenderingStrategy> renderingStrategy() {
119
118
120
119
@ NotNull
121
120
public <S > SqlColumn <S > withTypeHandler (String typeHandler ) {
122
- SqlColumn <S > column = new SqlColumn <>( this );
121
+ SqlColumn <S > column = copy ( );
123
122
column .typeHandler = typeHandler ;
124
123
return column ;
125
124
}
126
125
127
126
@ NotNull
128
127
public <S > SqlColumn <S > withRenderingStrategy (RenderingStrategy renderingStrategy ) {
129
- SqlColumn <S > column = new SqlColumn <>( this );
128
+ SqlColumn <S > column = copy ( );
130
129
column .renderingStrategy = renderingStrategy ;
131
130
return column ;
132
131
}
133
132
134
133
@ NotNull
135
134
public <S > SqlColumn <S > withParameterTypeConverter (ParameterTypeConverter <S , ?> parameterTypeConverter ) {
136
- SqlColumn <S > column = new SqlColumn <>( this );
135
+ SqlColumn <S > column = copy ( );
137
136
column .parameterTypeConverter = parameterTypeConverter ;
138
137
return column ;
139
138
}
140
139
140
+ /**
141
+ * This method helps us tell a bit of fiction to the Java compiler. Java, for better or worse,
142
+ * does not carry generic type information through chained methods. We want to enable method
143
+ * chaining in the "with" methods. With this bit of fiction, we force the compiler to delay type
144
+ * inference to the last method in the chain.
145
+ *
146
+ * @param <S> the type. Will be the same as T for this usage.
147
+ * @return a new SqlColumn of type S (S is the same as T)
148
+ */
149
+ @ SuppressWarnings ("unchecked" )
150
+ private <S > SqlColumn <S > copy () {
151
+ return new SqlColumn <>((SqlColumn <S >) this );
152
+ }
153
+
141
154
private String applyTableAlias (String tableAlias ) {
142
155
return tableAlias + "." + name (); //$NON-NLS-1$
143
156
}
0 commit comments