我有3个来自外部库(A,B,C)的类,它们都扩展了Object
如何定义一个只能包含这三种类型(及其子类)值的变量类型? 像
val myVal: A or B or C (or their sub-classes if this is possible)
答案 0 :(得分:1)
Scala不提供联合类型,但您可以使用<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.domain.app"
android:hardwareAccelerated="true"
android:versionCode="100008"
android:versionName="1.0.0" >
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="22" />
<supports-screens
android:anyDensity="true"
android:largeScreens="true"
android:normalScreens="true"
android:resizeable="true"
android:smallScreens="true"
android:xlargeScreens="true" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<application
android:hardwareAccelerated="true"
android:icon="@drawable/icon"
android:label="@string/app_name"
android:supportsRtl="true" >
<activity
android:name="com.domain.app.MainActivity"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale"
android:label="@string/activity_name"
android:launchMode="singleTop"
android:theme="@android:style/Theme.Black.NoTitleBar"
android:windowSoftInputMode="adjustResize" >
<intent-filter android:label="@string/launcher_name" >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
,即Coproduct
类型的概括。
Shapeless提供了一个很好的实现。
这是直接来自shapeless's feature overview
的示例Either
在示例中,您定义了scala> type ISB = Int :+: String :+: Boolean :+: CNil
defined type alias ISB
scala> val isb = Coproduct[ISB]("foo")
isb: ISB = foo
scala> isb.select[Int]
res0: Option[Int] = None
scala> isb.select[String]
res1: Option[String] = Some(foo)
类型Coproduct
,然后您可以使用ISB
来提取您要查找的类型。 select
的结果是select
,因为Option
可能包含也可能不包含该类型的实例。
其他不涉及图书馆的方法可以在这里找到:How to define "type disjunction" (union types)?以及Miles Sabin(无形的作者)的优秀博客文章:http://milessabin.com/blog/2011/06/09/scala-union-types-curry-howard/