web-dev-qa-db-ja.com

演算子==は、Kotlinの「Long」および「Int」に適用できません

Mike PenzのNavigationDrawer( https://github.com/mikepenz/MaterialDrawer )の一部をKotlinで実装しようとしています。それ以来、主にオペレーターに関連するいくつかの問題に遭遇しました。以下は、ドロワー自体をインスタンス化するコードの一部です。 Android Studioは、int変数およびLong変数で==演算子を使用している場合を除き、エラーをスローしません。

_        // 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
        }
    }
_

エラー:

if (drawerItem.identifier == (1)

if (drawerItem.identifier == 2)

_Operator == cannot be applied to 'Long and' 'Int'_

25
Martin Erlic

右側を長く使用するだけです

if (drawerItem.identifier == 1L)

編集:これが必要な理由は、KotlinがIntsをLongにプロモートしない(または、より一般的には、型を拡張しない)ためです。左側にはLongがあり、右側にはIntがあり、エラーになりました。右側がLongであることを明示的に示すと、エラーが修正されます。

74
Francesc

興味深いことに、別の解決策はcompareTo()を使用することです。 compareTo は、値が等しい場合はゼロを返し、他の値よりも小さい場合は負を返し、他の値よりも大きい場合は正を返します。

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

<operator!= longとintに適用されない>の問題に直面した場合、単に右側でlongを使用するだけです。つまり、value!= 1Lです。

0
Ranajit Sawant