Der Operator == kann in Kotlin nicht auf „Long“ und „Int“ angewendet werden

Lesezeit: 4 Minuten

Ich versuche, Teile von Mike Penz’ NavigationDrawer (https://github.com/mikepenz/MaterialDrawer) in Kotlin. Seitdem bin ich nur auf wenige Probleme gestoßen, hauptsächlich mit Operatoren. Hier ist ein Teil des Codes, um die Schublade selbst zu instanziieren. Android Studio wirft keine Fehler, außer wenn ich den Operator == für int- und Long-Variablen verwende:

        // Create the Drawer
        result = DrawerBuilder()
                .withSliderBackgroundColor(ContextCompat.getColor(applicationContext, R.color.top_header))
                .withActivity(this)
                .withToolbar(toolbar)
                .withHasStableIds(true)
                .withItemAnimator(AlphaCrossFadeAnimator())
                .withAccountHeader(headerResult!!)
                .addDrawerItems(
                        PrimaryDrawerItem().withName(R.string.drawer_item_profile).withIcon(FontAwesome.Icon.faw_user).withIdentifier(1).withSelectable(false).withIconColor(ContextCompat.getColor(applicationContext, R.color.icon_grey)).withTextColor(ContextCompat.getColor(applicationContext, R.color.stroke)),
                        PrimaryDrawerItem().withName(R.string.drawer_item_create).withIcon(FontAwesome.Icon.faw_paint_brush).withIdentifier(2).withSelectable(false).withIconColor(ContextCompat.getColor(applicationContext, R.color.icon_grey)).withTextColor(ContextCompat.getColor(applicationContext, R.color.stroke)),
                        PrimaryDrawerItem().withName(R.string.drawer_item_yaanich_news).withIcon(FontAwesome.Icon.faw_newspaper_o).withIdentifier(3).withSelectable(false).withIconColor(ContextCompat.getColor(applicationContext, R.color.icon_grey)).withTextColor(ContextCompat.getColor(applicationContext, R.color.stroke)),
                        PrimaryDrawerItem().withName(R.string.drawer_item_my_groups).withIcon(FontAwesome.Icon.faw_users).withIdentifier(4).withSelectable(false).withIconColor(ContextCompat.getColor(applicationContext, R.color.icon_grey)).withTextColor(ContextCompat.getColor(applicationContext, R.color.stroke)),
                        PrimaryDrawerItem().withName(R.string.drawer_item_settings).withIcon(FontAwesome.Icon.faw_cog).withIdentifier(5).withSelectable(false).withIconColor(ContextCompat.getColor(applicationContext, R.color.icon_grey)).withTextColor(ContextCompat.getColor(applicationContext, R.color.stroke))
                )
                .withOnDrawerItemClickListener { view, position, drawerItem ->

                    if (drawerItem != null) {
                        var intent: Intent? = null
                        if (drawerItem.identifier == (1) {
                            intent = Intent(this, UserProfileActivity::class.java)
                        } else if (drawerItem.identifier == 2) {
                            intent = Intent(this, YeetActivity::class.java)
                        } else if (drawerItem.identifier == 3) {
                            intent = Intent(this, RssActivity::class.java)
                        } else if (drawerItem.identifier == 4) {
                            intent = Intent(this, GroupsActivity::class.java)
                        } else if (drawerItem.identifier == 5) {
                            intent = Intent(this, UserSettingsActivity::class.java)
                        }
                        if (intent != null) {
                            this.startActivity(intent)
                        }
                    }
                    false
                }
                .withSavedInstance(savedInstanceState)
                .withShowDrawerOnFirstLaunch(true)
                .build()

        RecyclerViewCacheUtil<IDrawerItem<*, *>>().withCacheSize(2).apply(result!!.recyclerView, result!!.drawerItems)

        if (savedInstanceState == null) {
            result!!.setSelection(21, false)
            headerResult!!.activeProfile = profile
        }
    }

Fehler:

if (drawerItem.identifier == (1)

if (drawerItem.identifier == 2)

Operator == cannot be applied to 'Long and' 'Int'

  • Im Gegensatz zu Java stuft Kotlin Zahlen nicht automatisch in breitere Typen um. Für diese Vergleiche müssen Sie explizit dieselben Typen verwenden. Franscesc hat die richtige Antwort gegeben, aber wenn Ihr int in einer Variablen gespeichert wäre, würden Sie es tun if (drawerItem.identifier == id.toLong()).

    – Ruckus T-Boom

    1. Mai 2017 um 15:37 Uhr


Benutzer-Avatar
Franz

Einfach lang auf der rechten Seite verwenden

if (drawerItem.identifier == 1L)

Bearbeiten: Der Grund dafür ist, dass Kotlin Ints nicht zu Longs befördert (oder allgemeiner Typen nicht erweitert); auf der linken Seite hatten wir ein Long und auf der rechten Seite hatten wir ein Int, was zu dem Fehler führte. Die explizite Angabe, dass die rechte Seite ein Long ist, behebt den Fehler.

  • Die L-Casts deklarieren explizit die 1 Als ein Long eingeben, damit sie jetzt verglichen werden können. “Die explizite Angabe, dass die rechte Seite ein Long ist, behebt den Fehler.”

    – ataulm

    24. September 2019 um 12:26 Uhr


  • Wie allgemein gilt die Aussage „Kotlin fördert/erweitert Typen nicht“? Andere Dinge funktionieren, wie geordnete Vergleiche und der Elvis-Operator. Zum Beispiel, if (someLongValue > 1) funktioniert (dito >=, <und <=), und someNullableLongValue ?: 0 funktioniert und hat Typ Long.

    – kbolino

    1. November 2019 um 20:30 Uhr


Benutzer-Avatar
vgl

Bei Interesse wäre eine andere Lösung zu verwenden compareTo(). vergleichen mit gibt Null zurück, wenn die Werte gleich sind, negativ, wenn es kleiner als der andere ist, oder positiv, wenn es größer als der andere ist:

 if(drawerItem.identifier.compareTo(1) == 0)   "Equals"

  • Für das, was es wert ist, ist das Testen auf -1 oder 1 nicht dasselbe wie das Testen auf negativ oder positiv.

    – laalto

    20. August 2018 um 19:27 Uhr

Wenn die obige Lösung für Sie nicht funktioniert hat, versuchen Sie es ausdrücklich Konvertieren des Werts rechts in den bestimmten breiter Typ auf der linken Seite

num = 5.7
if (num == 4.toDouble()) {
    //some code
}

Jeder Zahlentyp unterstützt die folgenden Konvertierungen:

  • toByte(): Byte
  • toShort(): Kurz
  • toInt(): Int
  • toLong(): Lang
  • toFloat(): Schweben
  • toDouble(): Double
  • toChar(): Zeichen

wenn Sie mit dem Problem < Operator != wird nicht auf long und int angewendet > Lösen Sie es einfach mit lang auf der rechten Seite dh Wert! = 1L das ist es..

Stellen Sie sicher, dass, wenn Sie Double mit einer beliebigen Zahl wie myDouble == 5 vergleichen, es nicht funktioniert, bis Sie am Ende 0 hinzufügen. Dies liegt daran, dass Kotlin den Typ aus der eingegebenen Zahl errät und 5 als int und myDouble als doppelt betrachtet und denselben Fehler erzeugt

Machen Sie also die Vergleichsvariable immer explizit gleich einer anderen Variablen

drawerItem.identifier == (1.0)

1103360cookie-checkDer Operator == kann in Kotlin nicht auf „Long“ und „Int“ angewendet werden

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy