Class 在Scala中,您可以使用引用其他类或特性的变量创建实例吗?

Class 在Scala中,您可以使用引用其他类或特性的变量创建实例吗?,class,scala,reflection,instance,traits,Class,Scala,Reflection,Instance,Traits,我想做一个实例,用变量指定如下特征,这会给你一个错误。在scala中有这样做的方法吗 var traitRefer = classOf[SomeTrait] var a = new SomeClass() with traitRefer 我认为除了反射之外没有其他方法可以做到这一点,因为这是不安全的。您可以做的是创建一个实例,其中混合了模式匹配中的特定特征。例如 kind match { case "Foo" => new SomeClass with Foo case "Bar

我想做一个实例,用变量指定如下特征,这会给你一个错误。在scala中有这样做的方法吗

var traitRefer = classOf[SomeTrait]
var a = new SomeClass() with traitRefer

我认为除了反射之外没有其他方法可以做到这一点,因为这是不安全的。您可以做的是创建一个实例,其中混合了模式匹配中的特定特征。例如

kind match {
  case "Foo" => new SomeClass with Foo
  case "Bar" => new SomeClass with Bar
}

我认为这是不可能的(排除反射)。查看更多。 您可以这样做:

type Ref = SomeTrait
var a = new SomeClass with Ref

但我认为这不是你想要的

好问题!您在理解中缺少的是编译时发生的事情与运行时发生的事情

当Scala编译器遇到诸如
new Foo with Bar
之类的表达式时,它会在编译时生成一个与
class anonymous extends Foo with Bar
基本相同的匿名内部类。然后,编译器会对可堆叠的特性以及不生成所需输出的特性发挥所有魔力。基类和扩展特性必须在编译时定义;不能在运行时定义它们*

由于要混合的特性在运行时之前是未知的,因此编译器不知道为匿名类生成什么

我假设你的特质是利用改变
SomeClass
的行为。或者,您可以使用,并在运行时选择装饰器


(*)您可以在运行时为新类生成字节码。有很多方法可以做到这一点,包括嵌入Scala编译器。然而,这并不是假装的。当然,有一种更简单的方法来完成你想做的事情。

这毫无意义。此代码与java中的代码相同:
classtraitrefer=sometracit.Class;类a扩展了一些类实现了traitRefer
traitRefer只是一个变量!!!!是的,我想动态地应用一些特性,现在我知道为什么不能这样做了。设计模式可能是有用的。谢谢大家