使用Android从Scala调用不同的Java父构造函数

使用Android从Scala调用不同的Java父构造函数,java,android,scala,Java,Android,Scala,我需要继承android.support.v4.view.ViewPager和两个构造函数。在Java中,它是通过以下方式完成的: class MyViewPager extend android.support.v4.view.ViewPager { public ViewPager(Context context) { super(context); } public ViewPager(Context context, AttributeSet attrs) {

我需要继承android.support.v4.view.ViewPager和两个构造函数。在Java中,它是通过以下方式完成的:

class MyViewPager extend android.support.v4.view.ViewPager {
  public ViewPager(Context context) {
    super(context);
  }

  public ViewPager(Context context, AttributeSet attrs) {
    super(context, attrs);
  }
}
我在谷歌和这里搜索了一段时间,一些人建议在Scala中实现如下:

import android.support.v4.view.ViewPager

trait ViewPagerTrait extends ViewPager {
  // ...implement ViewPager non-constructor functions here...
}

object MyViewPager {
  def apply(context: Context) = new ViewPager(context) with ViewPagerTrait
  def apply(context: Context, attrs: AttributeSet) = new ViewPager(context, attrs) with ViewPagerTrait
}

上面的Scala代码可以编译,但是当Android试图构建视图时,
apply
方法似乎没有被正确调用。我认为这是因为当Android框架解析XML文件并尝试创建视图对象时,它使用反射来查找构造函数,因此它没有使用
apply
方法,正如LimbSoup和David自己已经说过的那样,这在Scala中是完全不可能的。您需要用Java编写这个类

所以坏消息是,您需要一些Java代码


好消息是,Scala编译器和大多数Scala工具都非常支持混合Java/Scala代码基。Java和Scala类可以自由地相互继承,编译器会很好地解决这个问题。因此,您不应该被迫用Java编写大量代码。

不幸的是,如果这是在Scala中作为类实现的,
(上下文:上下文)
构造函数必须调用
(上下文:上下文,attrs:AttributeSet)
构造函数,因此采用了trait方法。当然,如果android不能使用
apply
作为构造器,我认为这可能不得不退出窗口。我对android的了解还不够,不知道是否有可能进行某种涉及传递空的
属性集的黑客攻击。@LimbSoup,我试图将
null
传递给
attrs
,应用程序可以启动,但是行为改变了…所以我想这对我来说不是一个选项。我想你现在唯一的选择是将它实现为一个Java类。伴生对象方法不起作用,因为对于Java来说伴生对象看起来像类MyViewPager$。@Machisuji,是的,我也意识到…我想这个问题没有结论性的答案。