2012-05-21 2 views
1

После некоторых махинаций с Скале я пришел к этому решению для создания новых объектов из данного типаполучения типа от имени типа в Скале

object Entity { 

    def get[T <: Entity: ClassManifest]: T = { 

     val entity = implicitly[ClassManifest[T]].erasure.getConstructors()(0).newInstance().asInstanceOf[T] 

     /** some stuff **/ 

     entity 

    } 

} 

abstract class Entity { 

} 

class Implementation extends Entity { 

} 

, а затем Usage:

var e = Entity.get[Implementation] 

Мои вопросы

  1. это нормально или есть какой-то другой способ сделать это (я использую scala 2.9.2 сейчас)?

  2. Есть ли что-то вроде Class.forName, которое позволяет получить тип от его имени? (Или в более общем случае, можно использовать тип в качестве переменной?)

ответ

0

В качестве альтернативы, вы можете пройти Class[T]:

object Entity { 
    def get[T <: Entity](e: Class[T]): T = { 
    val entity = e.getConstructors()(0).newInstance().asInstanceOf[T] 
    /** some stuff **/ 
    entity 
    } 
} 

var e1 = Entity.get(classOf[Implementation]) 

Вы можете использовать Class.forName, но вы потеряете безопасность типов (так как string className может быть любым, а не только подклассом Entity), и я думаю, что ваш тип возврата должен быть Entity.

+0

'Class.forName' вернет' Class', никогда не экземпляр 'Entity', поэтому это всегда будет терпеть неудачу. –

7

Итак, одна из проблем с StackOverflow заключается в том, что никто не собирается давать мне очки за высказывание «Ого, это умно. Ради бога, никогда не делай этого или что-нибудь в этом роде». Тем не менее, как старший архитектор, это, как представляется, большая часть моей работы.

Если вы используете отражение снаружи или библиотеки или как причина для взаимодействия с библиотекой, вы делаете это неправильно. Так останови его.

+2

Да, сэр, капитан сэр! Приветствую, когда я печатаю, сэр! –

+0

А теперь, серьезно, какая-то особая причина, почему это неправильно? –

Смежные вопросы