![Incompatibilidade de tipo: não é possível converter de double para class em Anylogic](https://rvso.com/image/475747/Incompatibilidade%20de%20tipo%3A%20n%C3%A3o%20%C3%A9%20poss%C3%ADvel%20converter%20de%20double%20para%20class%20em%20Anylogic.png)
Sou muito novo em Java no Anylogic e, portanto, sinto que esta é provavelmente uma solução rápida.
Eu defini um tipo de classe chamada OperationResults:
public class OperationResults {
private final double multiplicationResult;
private final double additionResult;
private final double subtractionResult;
public OperationResults(double mulRes, double addRes, double subRes) {
this.multiplicationResult = mulRes;
this.additionResult = addRes;
this.subtractionResult = subRes;
}
}
A função na minha simulação é chamada 'callAPI' que simplesmente envia dois valores duplos ('a' e 'b') para o meu código API python. Ambos os conjuntos de códigos são os seguintes. Minha função 'callAPI':
try {
URL url = new URL("http://127.0.0.1:5000/operations");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json");
conn.setDoOutput(true);
String jsonInputString = "{\"a\": " + a + ", \"b\": " + b + "}";
try (OutputStream os = conn.getOutputStream()) {
byte[] input = jsonInputString.getBytes(StandardCharsets.UTF_8);
os.write(input, 0, input.length);
}
try (InputStream is = conn.getInputStream(); Scanner scanner = new Scanner(is)) {
String jsonResponse = scanner.useDelimiter("\\A").next();
JSONObject response = new JSONObject(jsonResponse);
double multiplicationResult = response.getDouble("multiplicationResult");
double additionResult = response.getDouble("additionResult");
double subtractionResult = response.getDouble("subtractionResult");
return new OperationResults(multiplicationResult, additionResult, subtractionResult);
}
} catch (Exception e) {
e.printStackTrace();
return new OperationResults(-1, -1, -1); // Error handling
}
Meu código python da API:
app = Flask(__name__)
@app.route('/operations', methods=['POST'])
def operations():
data = request.get_json(force=True)
a = data['a']
b = data['b']
result_multiply = a * b
result_addition = a + b
result_subtraction = a - b
return jsonify({
'multiplicationResult': result_multiply,
'additionResult': result_addition,
'subtractionResult': result_subtraction
})
if __name__ == '__main__':
app.run(debug=True)
Meu botão na minha simulação que executa a função é o seguinte:
for (Learner agent : learners) {
double a = agent.edu1Resources;
double b = agent.edu3Cost;
// API call
OperationResults results = callAPI(a, b);
// Update agent attributes or handle results
agent.multiplicationResult = results.multiplicationResult;
agent.additionResult = results.additionResult;
agent.subtractionResult = results.subtractionResult;
// Print results for each agent
traceln("Agent ID " + agent.getIndex() + ": edu1Resources * edu3Cost = " + results.multiplicationResult +
", edu1Resources + edu3Cost = " + results.additionResult +
", edu1Resources - edu3Cost = " + results.subtractionResult);
}
Os dois erros que estou recebendo afirmam que"Incompatibilidade de tipo: não é possível converter da classe 'OperationResults' para double"nofunçõescódigo e"Incompatibilidade de tipo: não é possível converter de duplo para classe 'OperationResults'"nobotãocódigo.
Eu realmente espero que haja uma explicação simples para meus erros, pois todo o resto parece estar bem. Agradeceríamos muito a ajuda.
Aqui está meu rastreamento de pilha:
Type mismatch: cannot convert from double to Main.OperationResults
at _2024_03_28.Main.executeShapeControlAction(Main.java:651)
at _2024_03_28.Main$6.action(Main.java:695)
at com.anylogic.engine.presentation.ShapeControl.executeAction(Unknown Source)
at com.anylogic.engine.presentation.ShapeButton.executeUserAction(Unknown Source)
at com.anylogic.engine.gui.ExperimentHost.executeUserAction(Unknown Source)
at com.anylogic.engine.internal.webserver.f.onAction(Unknown Source)
at com.anylogic.executor.basic.rest.BasicAnimationSessionController.lambda$null$3(BasicAnimationSessionController.java:71)
at com.anylogic.engine.internal.webserver.e.acceptToAnimationSvgSession(Unknown Source)
at com.anylogic.executor.basic.rest.BasicAnimationSessionController.lambda$startController$4(BasicAnimationSessionController.java:71)
at spark.ResponseTransformerRouteImpl$1.handle(ResponseTransformerRouteImpl.java:47)
at spark.http.matching.Routes.execute(Routes.java:61)
at spark.http.matching.MatcherFilter.doFilter(MatcherFilter.java:134)
at com.anylogic.engine.internal.webserver.config.ALServerFactory$1.lambda$0(Unknown Source)
at org.eclipse.jetty.servlets.QoSFilter.doFilter(QoSFilter.java:202)
at com.anylogic.engine.internal.webserver.config.ALServerFactory$1.doHandle(Unknown Source)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1598)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
at org.eclipse.jetty.server.Server.handle(Server.java:516)
at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:487)
at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:732)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:479)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:277)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311)
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105)
at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:338)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:315)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:173)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131)
at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:409)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:883)
at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1034)
at java.base/java.lang.Thread.run(Thread.java:834)
Responder1
Eu encontrei a solução. Na minha função callAPI
escrita em AnyLogic, alterei o tipo de saída esperado de 'double' para 'Other' e então declarei OperationResults
. Isso foi feito na opção ‘Valor de retorno’. Em vez de esperar fornecer uma saída de função double
, a saída da função está no tipo de classe OperationResults
que criei em meu código de classe na página principal.