簡體   English   中英

通過反射將類名稱傳遞給Scala中的超類構造函數

[英]Passing class name to super class constructor in Scala via reflection

如何將類的名稱傳遞給其超類構造函數,甚至有可能? 我正在考慮這樣的事情:

class TestClass extends SuperTestRequiringName(TestClass.getClass.getName) {}

這比將名稱作為硬編碼字符串傳遞更好,因為在重命名重構過程中會保持一致性。

更好的是實際的運行時類,因此,如果可能的話,我將獲得子類的名稱。 但這並不能正常工作:

class TestClass extends SuperTestRequiringName(this.getClass.getName) {}

我一般不問如何在運行時訪問超類內部的子類名稱。 重要的是,可以將類名用作超級構造函數參數,以便超級類可以將其傳遞給自己的超級類(從我無法更改的庫中)。

class TestClass extends SuperTestRequiringName(classOf[TestClass].getName)

在Scala中, classOf[A]與Java中的A.class相同。

getClass是一個方法,您只能調用類的實例。

我不確定我是否正確理解您的問題,但是您可以為此使用ClassTag 例如;

import scala.reflect._
class SuperTestRequiringName(name: String) {}
class TestClass extends SuperTestRequiringName(classTag[TestClass].runtimeClass.getName)

希望對您有所幫助!

我認為您的問題沒有一個好的解決方案。 JVM內存模型的工作方式是,在調用基本構造函數之前,甚至無法獲得自己的類名,都不能使用this 如果您從庫的類繼承的原因是重用其​​功能,而不是需要在使用基類的相同上下文中實際使用您的類,那么建議您用組成替換繼承,這是解決問題的正確方法無論如何,這樣的問題。 代碼如下:

case class Wrapper(s: String)

class LibraryClass(val w: Wrapper) {
  def someUsefulStuff(n: Int): String = ???

  def someNotUsefulStuff(n: Int): String = ???
}

class Base() {
  private val delegate:LibraryClass = new LibraryClass(Wrapper(this.getClass.getName))

  // expose useful methods from the delegate
  // depending on logic maybe decorate them as protected
  def someUsefulStuff(n: Int): String = delegate.someUsefulStuff(n)
}

class LeafA extends Base

class LeafB extends Base

在線查看此示例。

如果確實需要繼承自LibraryClass以便在這些上下文中使用,則可能必須像@ygor解決方案一樣,使子類顯式傳遞字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM