我想编写一个类型别名来缩短,修改和封装的Scala代码.假设我有一些集合,它具有作为地图列表的属性,其值是元组.我的类型会像List[Map[Int, (String, String)]]
我的应用程序允许的那样编写类似的东西或更通用的东西.我可以想象有一个超级类型要求Seq[MapLike[Int, Any]]
我或其他任何漂浮我的船,具体的子类更具体.
然后我想为这个长类型写一个别名.
class ConcreteClass {
type DataType = List[Map[Int, (String, String)]]
...
}
Run Code Online (Sandbox Code Playgroud)
然后我会愉快地使用ConcreteClass#DataType
我可以拿一个,并使用它.
现在假设我添加了一个函数
def foo(a : DataType) { ... }
Run Code Online (Sandbox Code Playgroud)
我想从外面用空列表来调用它.我可以打电话foo(List())
,但是当我想将我的基础类型更改为另一种类型时Seq
,我将不得不回来更改此代码.此外,这个空列表不是非常明确的DataType
.而伴侣对象没有相关的List
方法,所以我不能打电话DataType()
,或者DataType.empty
.当我需要非空列表时,它会更加烦人,因为我必须写出这个长类型的重要部分.
有什么方法可以让Scala把我的类型理解为同样的东西,包括带有创建者方法的伴随对象,为了缩短代码和黑盒子呢?或者,为什么我不应该首先这样做?
我有一个类及其伴随对象,它们共同具有一些可重用的功能.我已将伴随对象的功能封装成特征,所以现在的情况就像
class Foo {
import Foo._
def foo: Quux = bar(this)
}
trait Bar {
def bar(f: Foo): Quux = frobnicate(f)
}
object Foo extends Bar
Run Code Online (Sandbox Code Playgroud)
既然Foo.foo
是一种可重用的方法,我想把它放到它的特性中.
但我必须找到一种方法来告诉类型检查器,虽然bar
不是类的方法Foo
,但它将在范围内,因为从伴随对象导入.我想我需要能够键入类的伴随对象.
有类似的东西吗?
class Foo {
final val pi = 3
}
Run Code Online (Sandbox Code Playgroud)
每个Foo
对象都有pi
会员吗?我应该放入pi
伴侣物体吗?
scala final constants compile-time-constant companion-object
使用Scala 2.10/2.11宏天堂注释宏,如何添加或扩展带注释的类的伴随对象?骨架:
import scala.annotation.StaticAnnotation
import scala.reflect.macros._
import language.experimental.macros
class foo extends StaticAnnotation {
def macroTransform(annottees: Any*) = macro fooMacro.impl
}
object fooMacro {
def impl(c: Context)(annottees: c.Expr[Any]*): c.Expr[Any] = ???
}
Run Code Online (Sandbox Code Playgroud)
这样,给定
trait Foo[A]
Run Code Online (Sandbox Code Playgroud)
以下输入
@foo class Bar
object Baz {
def baz = 33
}
@foo class Baz
Run Code Online (Sandbox Code Playgroud)
将扩展为:
object Bar {
implicit def hasFoo: Foo[Bar] = ???
}
class Bar
object Baz {
def baz = 33
implicit def hasFoo: Foo[Baz] = ???
}
class Baz
Run Code Online (Sandbox Code Playgroud)
这是第一次天真的尝试,def …
我有一个案例类定义如下:
case class StreetSecondary(designator: String, value: Option[String])
Run Code Online (Sandbox Code Playgroud)
然后我定义一个显式的伴侣对象:
object StreetSecondary {
//empty for now
}
Run Code Online (Sandbox Code Playgroud)
定义显式伴随对象StreetSecondary的行为导致编译器生成"隐含伴随对象"丢失; 即替换为无法访问编译器生成的版本.例如,该tupled
方法可通过此隐式伴随对象在案例类StreetSecondary上使用.但是,一旦我定义了显式伴随对象,该tupled
方法就会"丢失".
那么,我需要定义/添加/更改上面的StreetSecondary显式伴随对象,以重新获得所有丢失的功能,并替换编译器提供的隐式伴随对象?我想要的不仅仅是tupled
恢复的方法.我想要unapply
恢复所有功能(例如,包括提取器/ ).
感谢您提供的任何指导/指导.
更新1
我已经做了足够的搜索来发现几件事:
A)必须在其案例类之前定义显式伴随对象(至少在Eclipse Scala-IDE工作表中就是这种情况,并且代码在IntelliJ IDE的工作表中不起作用,无论哪个先出现).
B)有一个强制tupled
工作的技术技巧(谢谢drstevens):(StreetSecondary.apply _).tupled
虽然这解决了特定的tupled
方法问题,但它仍然没有准确或完整地描述scala编译器在隐式伴随对象中提供的内容.
C)最后,可以定义显式伴随对象以扩展与主构造函数的参数的签名匹配的函数,并返回案例类的实例.它看起来像这样:
object StreetSecondary extends ((String, Option[String]) => StreetSecondary) {
//empty for now
}
Run Code Online (Sandbox Code Playgroud)
同样,我仍然不能准确或完整地描述scala编译器在隐式伴随对象中提供的内容.
我有一个混合项目Java
和Kotlin
课程,我想知道如何companion objects
从我的Java
课程中引用.
我们如何在Android kotlin中访问伴随对象内的应用程序上下文?我在抽象类中有一个伴随对象,并且我想访问上下文以读取“共享首选项”,但无法获取上下文。
更新:我正在使用Android库中的这些东西,而且我正在使用的类是抽象的
我有一个活动
class DummyActivity : Activity() {
companion object {
@JvmStatic fun onNewIntent(context: Context): Intent {
val intent = Intent(context, DummyActivity.javaClass)
return intent
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
Run Code Online (Sandbox Code Playgroud)
它在清单中声明如下:
<activity android:name=".DummyActivity"/>
</application>
Run Code Online (Sandbox Code Playgroud)
当我尝试启动它时,我得到:
引起:android.content.ActivityNotFoundException:无法找到显式活动类> {com.example.andrzejzuzak.visiondummyapp/com.example.andrzejzuzak.visiondummyapp.DummyActivity $ Companion}; 你有没有在AndroidManifest.xml中声明这个活动?在Android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1794)的android.app.Instrumentation.execStartActivity(Instrumentation.java:1512)android.app.Activity.startActivityForResult(Activity.java:3930)的android.support.在android.app.Activity.startActivityForResult(Activity.java:3890)的android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:79)下的v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:50)位于android.app.Activity.startActivity(Activity.java:4181)的android.app.Activity.startActivity(Activity.java:4213)上的.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:859).在Android.app的android.app.ActivityThread.deliverResults(ActivityThread.java:3695)的android.app.Activity.dispatchActivityResult(Activity.java:6456)上的example.andrzejzuzak.visiondummyapp.MainActivity.onActivityResult(MainActivity.kt:85) .ActivityThread.handleSendResult(ActivityThread.java:3742 )在Android.A.运行时android.app.Handler.dispatchMessage(Handler.java:102)的android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1393)上的android.app.ActivityThread.-wrap16(ActivityThread.java). os.Looper.loop(Looper.java:148)在android.app.ActivityThread.main(ActivityThread.java:5417)java.lang.reflect.Method.invoke(Native Method)
困扰我的是这条线:
无法找到显式活动类{com.example.andrzejzuzak.visiondummyapp/com.example.andrzejzuzak.visiondummyapp.DummyActivity $ Companion
它是否真的意味着我必须在某处注册Companion对象?
我想在我的应用程序中使用 BottomNavigationView 并且我正面临着 kotlin 的这个问题(以前从未在 Java 中遇到过)我看到这条消息:分类器“listFragment”没有伴随对象,因此必须在此处初始化
这是我的代码:
private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
when (item.itemId) {
R.id.listNav -> {
//the problem is here in listFragment word below
setFragment(listFragment)
return@OnNavigationItemSelectedListener true
}
R.id.accountNav -> {
//the problem is here also in accountFragment word below
setFragment(accountFragment)
return@OnNavigationItemSelectedListener true
}
false
}
private fun setFragment(fragment: Fragment) {
supportFragmentManager.beginTransaction().replace(R.id.mainFrame , fragment).commit()
}
Run Code Online (Sandbox Code Playgroud)
任何帮助表示赞赏:)
我注意到,如果不推荐使用 case 类,则不推荐使用它的伴生对象。
scala> @deprecated case class A(x: Int)
warning: there was one deprecation warning; re-run with -deprecation for details
defined class A
scala> A(0)
res0: A = A(0)
scala> new A(0)
warning: there was one deprecation warning; re-run with -deprecation for details
res1: A = A(0)
Run Code Online (Sandbox Code Playgroud)
我想收到一个警告,A(0)
正如我收到的一样new A(0)
。我应该明确定义伴随对象并弃用它吗?有没有更好的方法?
companion-object ×10
scala ×6
kotlin ×4
android ×2
case-class ×1
constants ×1
deprecated ×1
final ×1
fragment ×1
interop ×1
java ×1
macros ×1
type-alias ×1
types ×1