There have been recent changes in the area of raw types (TreeView field in this 
case).  Instead of holding T as "?" or "? extends Object", it is now resolved 
to the erasure type "Object".  So, TreeCell<Path> is not compatible with 
TreeCell<Object> and an error is emitted.

If you specified your field with a type argument, the return type checking 
should be okay:

      @FXML private TreeView<Path> treeView


________________________________
From: Mirco Colletta <mirch...@gmail.com>
Sent: Monday, December 2, 2024 4:42 PM
To: dev@groovy.apache.org <dev@groovy.apache.org>
Cc: Milles, Eric (TR Technology) <eric.mil...@thomsonreuters.com>
Subject: Re: [EXT] Static type checking error from groovy version 4.0.22

Hi Eric,
actually there isn't an explicit instantiation of the treeView in the code 
since it's defined inside an .fxml file:

<TreeView fx:id="treeView" styleClass="folder-tree" maxWidth="Infinity" 
maxHeight="Infinity" VBox.vgrow="ALWAYS"/>

that is eventually loaded inside the controller:

FXMLLoader fxmlLoader = new 
FXMLLoader(getClass().getResource(getClass().getSimpleName() + ".fxml"))
...
fxmlLoader.load()

But in the controller declaration I didn't specify the type of the generics

@FXML private TreeView treeView

so maybe a recent modification made the groovy type checker more strict.

Thanks

Il Lun 2 Dic 2024, 21:40 Milles, Eric (TR Technology) via dev 
<dev@groovy.apache.org<mailto:dev@groovy.apache.org>> ha scritto:
The missing info from your description for me is how treeView is declared.  
When I ensure that treeView is an instance of TreeView<Path>, the checks work 
out fine.


interface Callback<P,R> {
 R call(P param)
}
class TreeCell<T> {
}
class TreeView<T> {
 void setCellFactory(Callback<TreeView<T>,TreeCell<T>> value) {
 }
}
class Path { }
class PathTreeCell extends TreeCell<Path> { }

@groovy.transform.TypeChecked test() {
 def treeView = new TreeView<Path>() // not TreeView or TreeView<?>
 treeView.setCellFactory({ /*TreeView<Path>*/ p ->
   def treeCell = new PathTreeCell()
   return treeCell
 })
}


________________________________
From: Milles, Eric (TR Technology) via dev 
<dev@groovy.apache.org<mailto:dev@groovy.apache.org>>
Sent: Monday, December 2, 2024 9:45 AM
To: dev@groovy.apache.org<mailto:dev@groovy.apache.org> 
<dev@groovy.apache.org<mailto:dev@groovy.apache.org>>
Cc: Milles, Eric (TR Technology) 
<eric.mil...@thomsonreuters.com<mailto:eric.mil...@thomsonreuters.com>>
Subject: Re: [EXT] Static type checking error from groovy version 4.0.22

Micro,
Please create a new bug report at 
issues.apache.org<https://urldefense.com/v3/__http://issues.apache.org__;!!GFN0sa3rsbfR8OLyAw!ZOfYR2D6zT7F52tmV8qCubBdUFRDQNPfX56LZWLNMCdJMavUdhHk16eT0jgS-b3W4VkAxN5J0w3lU_GMAmvD7m8$>
 and I will have a look at what changed.
________________________________
From: Mirco Colletta <mirch...@gmail.com<mailto:mirch...@gmail.com>>
Sent: Saturday, November 30, 2024 12:20 PM
To: dev@groovy.apache.org<mailto:dev@groovy.apache.org> 
<dev@groovy.apache.org<mailto:dev@groovy.apache.org>>
Subject: [EXT] Static type checking error from groovy version 4.0.22

External Email: Use caution with links and attachments.

Hello,
recently I've updated the groovy version of my project (STC with 
compiler-configuration) from 4.0.21 to 4.0.24 and in the process I've 
encountered the following unexpected error:
[Static type checking] - Cannot return value of type ...PathTreeCell for 
closure expecting javafx.scene.control.TreeCell<java.lang.Object>
(after further investigation it seems introduced from v4.0.22)

The error came up calling this method of the JavaFx TreeView (with a closure)
https://openjfx.io/javadoc/21/javafx.controls/javafx/scene/control/TreeView.html#setCellFactory(javafx.util.Callback)<https://urldefense.com/v3/__https://openjfx.io/javadoc/21/javafx.controls/javafx/scene/control/TreeView.html*setCellFactory(javafx.util.Callback)__;Iw!!GFN0sa3rsbfR8OLyAw!bhkxAtKCcCoBP6_yq_UXSTJtpdyaaP3fx207yBuyP6IrCOCFSCZBuachWG4pzvoKw3JK31poWMrMii3T5yhIza0$>
public final void setCellFactory(Callback<TreeView<T>,TreeCell<T>> value)

My code:
public class PathTreeCell extends TreeCell<Path> { … }
...
treeView.setCellFactory({ p ->
                var treeCell = new PathTreeCell(this)
                makeDraggable(treeCell)
                // This doesn't work anymore
                //  return treeCell
                return (TreeCell<Path>)treeCell // OK
            })

This portion of code has always worked for every version of groovy STC I've 
used up until now.
As above, the workaround is effortless, just an explicit cast to TreeCell<Path>
Nevertheless I'm worried that it could be some sort of side effect of a 
regression.

Is this an intentional change of behaviour or a bug?

Cheers,
Mirco

Reply via email to