[ 
https://issues.apache.org/jira/browse/GROOVY-10055?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17333326#comment-17333326
 ] 

Eric Milles edited comment on GROOVY-10055 at 4/27/21, 3:11 PM:
----------------------------------------------------------------

You are using {{PostgreSQLContainer}} as a raw type, so there is no explicit 
argument assigned to the {{SELF}} type parameter.  Looks like the 
"fully-resolve" code (aka 
{{StaticTypeCheckingVisitor#inferReturnTypeGenerics}}) that tries to get a 
concrete type to work with is getting Object in the current codebase.

If each of the "with" methods are returning "this" and not a new instance, your 
grooviest workaround would be:
{code:groovy}
def postgreSqlServer = new PostgreSQLContainer().tap {
  withExposedPorts(5432)
  withEnv(["TZ": "Europe/Paris"])
  withDatabaseName("my_database")
  withUsername("user")
  withPassword("pass")
}
{code}


was (Author: emilles):
You are using {{PostgreSQLContainer}} as a raw type, so there is no explicit 
argument assigned to the {{SELF}} type parameter.  Looks like the 
"fully-resolve" code that tries to get a concrete type to work with is getting 
Object in the current codebase.

If each of the "with" methods are returning "this" and not a new instance, your 
grooviest workaround would be:
{code:groovy}
def postgreSqlServer = new PostgreSQLContainer().tap {
  withExposedPorts(5432)
  withEnv(["TZ": "Europe/Paris"])
  withDatabaseName("my_database")
  withUsername("user")
  withPassword("pass")
}
{code}

> STC does not support self bounded types
> ---------------------------------------
>
>                 Key: GROOVY-10055
>                 URL: https://issues.apache.org/jira/browse/GROOVY-10055
>             Project: Groovy
>          Issue Type: Improvement
>          Components: Static compilation, Static Type Checker
>    Affects Versions: 3.0.8
>            Reporter: Damir Murat
>            Assignee: Eric Milles
>            Priority: Major
>
> Some popular libraries use self bounded types for creating builder 
> hierarchies. For example, 
> PostgreSQLContainer (from Tescontainers library) is declared as 
> {code}
> public class PostgreSQLContainer<SELF extends PostgreSQLContainer<SELF>> 
> extends JdbcDatabaseContainer<SELF>
> {code}
> where JdbcDatabaseContainer is declared as
> {code}
> public abstract class JdbcDatabaseContainer<SELF extends 
> JdbcDatabaseContainer<SELF>> extends GenericContainer<SELF> implements 
> LinkableContainer
> {code}
> and so on.
> In the following example (tested with Groovy Console), I'm trying to create 
> and modify such an object with its corresponding fluent API:
> {code}
> import org.testcontainers.containers.PostgreSQLContainer
> import groovy.transform.CompileStatic
> @Grab("org.testcontainers:testcontainers:1.15.3")
> @Grab("org.testcontainers:postgresql:1.15.3")
> @CompileStatic
> class TestcontainersTester {
>   static void testSome() {
>     PostgreSQLContainer postgresqlServer = new PostgreSQLContainer()
>         .withExposedPorts(5432)
>         .withEnv(["TZ": "Europe/Paris"])
>         .withDatabaseName("my_database")
>         .withUsername("user")
>         .withPassword("pass")
> // Working alternative 1
> //    PostgreSQLContainer postgresqlServer = new 
> PostgreSQLContainer<PostgreSQLContainer<PostgreSQLContainer<PostgreSQLContainer<PostgreSQLContainer>>>>()
> //        .withExposedPorts(5432)
> //        .withEnv(["TZ": "Europe/Paris"])
> //        .withDatabaseName("my_database")
> //        .withUsername("user")
> //        .withPassword("pass")
> // Working alternative 2
> //    PostgreSQLContainer postgresqlServer = new PostgreSQLContainer<>()
> //    postgresqlServer.withExposedPorts(5432)
> //    postgresqlServer.withEnv(["TZ": "Europe/Paris"])
> //    postgresqlServer.withDatabaseName("my_database")
> //    postgresqlServer.withUsername("user")
> //    postgresqlServer.withPassword("pass")
>     println postgresqlServer
>   }
> }
> TestcontainersTester.testSome();
> {code}
> Unfortunately, STC complains with several errors:
> {code}
> 4 compilation errors:
> [Static type checking] - Cannot call SELF#withEnv(java.util.Map 
> <java.lang.String, java.lang.String>) with arguments [java.util.LinkedHashMap 
> <java.lang.String, java.lang.String>] 
>  at line: 11, column: 17
> [Static type checking] - Cannot find matching method 
> java.lang.Object#withDatabaseName(java.lang.String). Please check if the 
> declared type is correct and if the method exists.
>  at line: 12, column: 26
> [Static type checking] - Cannot find matching method 
> java.lang.Object#withUsername(java.lang.String). Please check if the declared 
> type is correct and if the method exists.
>  at line: 13, column: 22
> [Static type checking] - Cannot find matching method 
> java.lang.Object#withPassword(java.lang.String). Please check if the declared 
> type is correct and if the method exists.
>  at line: 9, column: 44
> {code}
> There are two working alternatives in the example. "Alternative 1" is not 
> really practical, but maybe it can help with solving the issue. "Alternative 
> 2" is an actual practical workaround that can be further improved by using 
> the "with" method.
> Tnx



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to