(не полное решение, но может дать некоторые идеи)
Одна впечатляющая особенность Scala - это возможность возвращать список фруктов, когда апельсин добавляется в список яблок.Все в порядке со значениями, именно потому, что вы позволяете выводить универсальный тип.
import scala.reflect.Manifest
def CommonSuperType[A, B >: A : Manifest](a:A, b:B) = manifest[B]
Это работает (вроде):
scala> CommonSuperType(new JButton, new JPanel)
res42: Manifest[javax.swing.JComponent with javax.accessibility.Accessible] = javax.swing.JComponent with javax.accessibility.Accessible
Следующим шагом будет поднять этот трюк на более высокийродственные типы (не проверено).
Полусгоревшее решение состоит в создании значений из типов (ср. этот ответ ):
class CommonSuper[A:Manifest, B:Manifest] {
def make[T:Manifest] = manifest[T].erasure.newInstance.asInstanceOf[T]
val instanceA = make[A]
val instanceB = make[B]
def getType = CommonSuperType(instanceA, instanceB)
}
Но я застрял в этой неинтуитивной непоследовательности:
scala> val test = new CommonSuper[JButton, JPanel]
scala> test.getType
res66: Manifest[Any] = Any
scala> CommonSuperType(test.instanceA, test.instanceB)
res67: Manifest[javax.swing.JComponent with javax.accessibility.Accessible] = javax.swing.JComponent with javax.accessibility.Accessible
В любом случае, хотя мне нравятся вопросы такого типа (вопросы о типах), здесь пахнет XY Проблема .