1
resposta

inferred type is BigDecimal? but BigDecimal was expected

Estou recebendo o erro Type mismatch: inferred type is BigDecimal? but BigDecimal was expected

import java.math.BigDecimal
import java.math.RoundingMode

fun bigDecimal(){
    val salarios = bigDecimalArrayof("1500.55", "2000.0", "5000.66")
    println(salarios.contentToString())

val aumento = "1.1".toBigDecimal()

val salarioComAumento: Array<BigDecimal> = salarios
    .map { salario -> calculaAumentoRelativo(salario, aumento) }
    .toTypedArray()


    println(salarioComAumento.contentToString())


    val gastoInicial = salarioComAumento.somando()

    println(gastoInicial)

}




private fun calculaAumentoRelativo(salario: BigDecimal, aumento: BigDecimal): BigDecimal? =
    if (salario < "5000".toBigDecimal()) {
        salario + "500".toBigDecimal()
    } else {
        (salario * aumento).setScale(2, RoundingMode.UP)
    }

fun bigDecimalArrayof(vararg valores:String):Array<BigDecimal> {
return Array(valores.size) { i -> valores[i].toBigDecimal()
    }
}


 fun Array<BigDecimal>.somando(): BigDecimal {
    return this.reduce {valorVazio, valor ->
        valorVazio + valor
    }
}
1 resposta

Na função "calculaAumentoRelativo", você tá falando pro compilador que a função pode retornar um BigDecimal ou valor nulo:

private fun calculaAumentoRelativo(salario: BigDecimal, aumento: BigDecimal):** BigDecimal? **=
    if (salario < "5000".toBigDecimal()) {
        salario + "500".toBigDecimal()
    } else {
        (salario * aumento).setScale(2, RoundingMode.UP)
    }

O erro tá na chamada do "toTypedArray()", na parte em que

val salarioComAumento: Array<BigDecimal> = salarios
    .map { salario -> calculaAumentoRelativo(salario, aumento) }
    **.toTypedArray()**

Isso acontece porque esse método não possui chamada para valores nulos (já que na sua função que calcula o aumento pode retornar nulo). Ao retirar o "?" ou simplesmente não especificar tipo do retorno na função "calculaAumentoRelativo" o código executa perfeitamente, então a solução seria

Sem especificar retorno:

fun calculaAumentoRelativo(salario: BigDecimal, aumento: BigDecimal) =
    if (salario < "5000".toBigDecimal()) {
        salario + "500".toBigDecimal()
    } else {
        (salario * aumento).setScale(2, RoundingMode.UP)
    }

ou

Retirando a ? keyword que faz referência a um possível retorno nulo:

fun calculaAumentoRelativo(salario: BigDecimal, aumento: BigDecimal): BigDecimal =
    if (salario < "5000".toBigDecimal()) {
        salario + "500".toBigDecimal()
    } else {
        (salario * aumento).setScale(2, RoundingMode.UP)
    }