如何解释和翻译kotlin代码到java?

我一直在试图把这个Kotlin代码翻译成Java,因为这个项目是用Java编写的。 我正在翻译Kotlin语法。 但是,还有一些我很难理解。

https://github.com/airbnb/lottie-android/blob/master/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/AppIntroActivity.kt

特别:

private val animationView: LottieAnimationView by lazy { rootView.inflate(R.layout.app_intro_animation_view, false) as LottieAnimationView } private val viewPager: LockableViewPager by lazy { findViewById<LockableViewPager>(R.id.intro_activity_viewPager) } override fun generateFinalButtonBehaviour(): IntroButton.Behaviour { return object : IntroButton.Behaviour { override fun setActivity(activity: IntroActivity) { finish() } override fun getActivity(): IntroActivity? = null override fun run() {} } } private fun setViewPagerScroller() { try { val scrollerField = ViewPager::class.java.getDeclaredField("mScroller") scrollerField.isAccessible = true val interpolator = ViewPager::class.java.getDeclaredField("sInterpolator") interpolator.isAccessible = true val scroller = object : Scroller(this, interpolator.get(null) as Interpolator) { override fun startScroll(startX: Int, startY: Int, dx: Int, dy: Int, duration: Int) { super.startScroll(startX, startY, dx, dy, duration * 7) } } scrollerField.set(viewPager, scroller) } catch (e: NoSuchFieldException) { // Do nothing. } catch (e: IllegalAccessException) { // Do nothing. } } 

对于setViewPagerScroller ,我能够翻译第一部分。

 Field scrollerField = ViewPager.class.getDeclaredField("mScroller"); scrollerField.setAccessible(true); Field interpolator = ViewPager.class.getDeclaredField("sInterpolator"); interpolator.setAccessible(true); 

setViewPagerScroller方法使用kotlin 匿名内部类语法。 这是在java语法中没有真正对应的“对象”部分。

 private void setViewPagerScroller() { try { Field scrollerField = ViewPager.class.getDeclaredField("mScroller"); scrollerField.setAccessible(true); Field interpolator = ViewPager.class.getDeclaredField("sInterpolator"); interpolator.setAccessible(true); Scroller scroller = new Scroller(this, (android.view.animation.Interpolator) interpolator.get(null)){ @Override public void startScroll(int startX, int startY, int dx, int dy, int duration) { super.startScroll(startX, startY, dx, dy, duration * 7); } } scrollerField.set(viewPager, scroller); } catch (NoSuchFieldException error) { // Do nothing. } catch (IllegalAccessException error) { // Do nothing. } } 

as关键字就像是在java中的投射。 希望你可以用这个翻译fun generateFinalButtonBehaviour() ,它包含了更多的相同内容。

懒惰的构造在java中变得更加冗长。 如果您选择遵循下面的结构,您必须采用纪律措施来错误地访问视图。

 private LockableViewPager viewPager; private LockableViewPager getViewPager(){ if(viewPager == null){ // produce viewpager and store in field } return viewPager; } 

您也可以使用一个类来更准确地表示您的字段的惰性初始化。 (所以你不能错误地访问你想要被懒惰地初始化的字段)这将变得更加冗长,但可能是值得的。