Scala类/类型,可以是其他一组未链接类中的一个

时间:2015-09-16 09:40:41

标签: scala

我有3个来自外部库(A,B,C)的类,它们都扩展了Object

如何定义一个只能包含这三种类型(及其子类)值的变量类型? 像

val myVal: A or B or C (or their sub-classes if this is possible)

1 个答案:

答案 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/