当前位置: 首页 > 知识库问答 >
问题:

静态编程语言新手…有选项和铸造问题

邢思淼
2023-03-14

只是对造型和如何设置类变量感到困惑。在java中,这是可能的

private var mSectionsStatePageAdapter : SectionsStatePagerAdapter? = null
private val mViewPager : ViewPager? = null

现在我们在Kotlin了

class MainActivity : AppCompatActivity() {
   private var mSectionsStatePageAdapter : SectionsStatePagerAdapter? = null
   private val mViewPager : ViewPager? = null

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val mytoolbar:Toolbar = findViewById(R.id.top_toolbar)
    setSupportActionBar(mytoolbar)

    mSectionsStatePageAdapter =  SectionsStatePagerAdapter(getSupportFragmentManager())
    mViewPager = findViewById(R.id.viewpager1)


    setupViewPager(mViewPager)
}



 fun setupViewPager(viewPager :ViewPager):Unit {
        var adapter : SectionsStatePagerAdapter = SectionsStatePagerAdapter(getSupportFragmentManager())
        adapter.addFragment(Fragment1(),"Fragment1")
        viewPager.setAdapter(adapter)
    }

错误:(65,24)智能转换为“ViewPager!”是不可能的,因为“mViewPager”是一个可变属性,此时可能已经更改

共有2个答案

苏胤
2023-03-14

这里发生了两件事。

首先,正如@gyosida所指出的,您已经将mPager属性定义为val而不是var,因此它不能在mViewPager=findViewById(R.id.viewpager1)行中重新分配。正如@Joshua所指出的,您要么必须将其设为var,要么需要将其设为lateinit val,以解决它未使用类实例初始化的问题。

第二个是由您描述的实际错误“可能已更改的可变属性”表示的,如果将其设置为变量,您将继续看到这一点。使用<code>lateinit</code>的方法可能是更好的方法。

但是,为了解释此错误,请在您的方法声明中执行以下操作:

fun setupViewPager(viewPager: ViewPager): Unit {

您说过viewPager的参数不能为空。如果是,它将是viewPager: ViewPager?。因此,如果您将可能为空的内容传递给它,您将收到编译错误。

科特林告诉你的是,在字里行间:

mViewPager = findViewById(R.id.viewpager1)

setupViewPager(mViewPager)

某些东西——想象另一个线程上的另一个方法——可能已经将mViewPager的值从该分配的实例更改为null。因此传入它是不安全的。

在不改变方法的情况下解决这个问题的唯一方法是提供一个保证非空的值。有几种方法可以做到这一点:

  • 将值分配给不能扰的方法级变量,并将其作为参数提供
  • 仅当值为非空时才调用您的函数,例如 mView 页码?。let{ 寻呼机 -

闾丘鸣
2023-03-14

对于Android,通常使用<code>lateinit var等中)。您可以选择两条路线:

  • lateinit var 变量:类型
  • 变量:类型?

我建议您在准备使用变量时,该变量是否可用。您不需要执行<code>null<code>检查lateinit表示延迟初始化。Kotlin使用<code>null</code>表示尚未初始化,因此不能使用可空类型并对其赋值null。

如果您的变量可为空,那么您应该走第二条路。

此外,如果您正在处理视图,您应该使用Android扩展来处理。您不需要自己在<code>活动

 类似资料:
  • 上面是一段代码,它以某种形式出现在我即将进行的一次考试的过去试卷中。这个问题的想法是衡量你是否完全理解多态性,动态和静态铸造。面向对象的基本思想。 我想把我认为正确的东西拿出来,如果人们能纠正我或补充一点,我将不胜感激。 我看不出任何与上面代码相关的其他观点。

  • 我试图用OkHttp和Cucumber在静态编程语言中设置一个Spring启动项目,并且在运行Cucumber任务时遇到以下错误。如何修复? 还有build gradle kts片段 我看到了这个错误https://github.com/square/okio/issues/647看起来可能是它,并修复了这个build.gradle,我如何将其翻译为kotlinbuild.gradle.kts?

  • 正如标题所说,我正在尝试将Java和Kotlin混合在一个项目中。这里有一个很好的例子。混合java kotlin hello world。除了kotlin在src/main/Java/somepackage/SomeClass中找不到我的任何Java类之外,所有的东西都正常工作。Java语言 这是什么原因? 我的身材。gradle看起来像这样 而不是开始尝试在更大的项目上实现这一点。我试图通过创

  • 如图所示,https://stackoverflow.com/a/16639438/8949356,在Java中,当声明的类是公共类时,可以重写其函数 但是我想知道如何用静态编程语言编写完全相同的代码,我已经尝试了很多,但没有找到任何关于这个主题的东西。我可以在Java中去做这件事,但我的其余代码是用静态编程语言编写的,而且我不能一直带着这种怀疑;静态编程语言对我来说是一个很好的工具,我想学习它。

  • 我是一个初学静态编程语言的学生,正在学习一个示例回收人员视图。我开始编码,但没有得到我应该得到的结果,即使在检查和重新检查代码之后也是如此。然后我注意到,即使使用非常基本的代码,它仍然没有按照应有的方式运行。我将包含基本代码,当使用时,它应该显示一个通用列表。我只得到列表中的一项。我怀疑代码以外的其他东西正在影响结果;但是我还没有达到知道的水平。 请看活动内容。xml: 注意它有行。 下面是列表(

  • 我有两个单选组(组1和组2),分别包含3个单选按钮。我用这个准则把左右两列分开,各占一半。由于两个无线组是分开的,当用户单击组1时,我希望清除组2中的选定项(如果有)。任何想法都可以做到,因为我是由Kotlin编写的,所以我在stackoverflow ConstraintLayout、RadioGroup和RadioButton RadioGroup的两列中找到了一些示例,其中两列有十个单选按钮