B4J Question Is it possible to Upcast an Object To an Interface Using JavaObject?

keirS

Well-Known Member
Licensed User
Longtime User
B4X:
WorkbookEvaluatorProvider wbEvalProv = (WorkbookEvaluatorProvider) wb.getCreationHelper().createFormulaEvaluator()
Trying to stay away from using inline Java and I can't think of a way of doing this using JavaObject.
 

stevel05

Expert
Licensed User
Longtime User
What type is returned? Does it cause an error if you don't cast it?
 
Upvote 0

keirS

Well-Known Member
Licensed User
Longtime User
It's used as a parameter for a constructor of another class so it won't instantiate the class.
 
Upvote 0

Daestrum

Expert
Licensed User
Longtime User
B4X:
...
 Dim wb As PoiWorkbook
 Dim wbe As JavaObject
 wb.InitializeNew(False)
 wbe =  asJO(wb).RunMethodJO("getCreationHelper",Null).RunMethod("createFormulaEvaluator",Null)
 Log(wbe)
End Sub
Sub asJO(o As JavaObject) As JavaObject
 Return o
End Sub
 
Upvote 0

keirS

Well-Known Member
Licensed User
Longtime User
Hmm this doesn't work.

B4X:
Dim JOCell As JavaObject = ExcelCell
    Dim JOWorkbook As JavaObject = JOCell.RunMethodJO("getSheet",Null).RunMethodJO("getWorkbook",Null)
    Dim JOFormulaEvaluator As JavaObject = JOWorkbook.RunMethodJO("getCreationHelper",Null).RunMethodJO("createFormulaEvaluator",Null)
    Dim JOWorkBookEvaluatorProvider As JavaObject 
    JOWorkBookEvaluatorProvider = JOWorkbook.RunMethodJO("getCreationHelper",Null).RunMethodJO("createFormulaEvaluator",Null)
    Dim JOConditionalFormattingEvaluator As JavaObject
    JOConditionalFormattingEvaluator.InitializeNewInstance("org.apache.poi.ss.formula.ConditionalFormattingEvaluator",Array As Object (JOWorkbook,JOWorkBookEvaluatorProvider))
    Dim JODataFormatter As JavaObject
    JODataFormatter.InitializeNewInstance("org.apache.poi.ss.usermodel.DataFormatter",Null)
    'Return JODataFormatter.RunMethod("formatCellValue",Array(JOCell,JOFormulaEvaluator))
    Return  JODataFormatter.RunMethod("formatCellValue",Array(JOCell,JOFormulaEvaluator,asJO(JOConditionalFormattingEvaluator)))
The formatCellValue Method i am trying to use is from the org.apache.poi.ss.usermodel.DataFormatter class is:
B4X:
formatCellValue(Cell cell, FormulaEvaluator evaluator, ConditionalFormattingEvaluator cfEvaluator)
I get the following error:
B4X:
java.lang.RuntimeException: Method: formatCellValue not matched.

The commented out return line does work:

B4X:
Return JODataFormatter.RunMethod("formatCellValue",Array(JOCell,JOFormulaEvaluator))
 
Upvote 0

Daestrum

Expert
Licensed User
Longtime User
B4X:
    Return  JODataFormatter.RunMethod("formatCellValue",Array(JOCell,JOFormulaEvaluator,asJO(JOConditionalFormattingEvaluator)))

JOConditionalFormattingEvaluator is already a JavaObject - no need for the asJO(…) around it
 
Upvote 0

keirS

Well-Known Member
Licensed User
Longtime User
B4X:
    Return  JODataFormatter.RunMethod("formatCellValue",Array(JOCell,JOFormulaEvaluator,asJO(JOConditionalFormattingEvaluator)))

JOConditionalFormattingEvaluator is already a JavaObject - no need for the asJO(…) around it

Removing it doesn't make a difference.
 
Upvote 0

keirS

Well-Known Member
Licensed User
Longtime User
I have found the problem. JPOI uses version 3.16 which doesn't support this method. Latest version of POI is 4.00.
 
Upvote 0

DonManfred

Expert
Licensed User
Longtime User
JPOI uses version 3.16 which doesn't support this method. Latest version of POI is 4.00.
you can try to change the dependency in the jPOI.xml file
Change the line
<dependsOn>poi-3.16</dependsOn>
to match V4 and try if it just works...

Worth a try
 
Last edited:
Upvote 0
Top