从Effective Java Second Edition,第28项:"不要使用通配符类型作为返回类型.它不会为用户提供额外的灵活性,而是迫使他们在客户端代码中使用通配符类型."
public final Class<? super T> getRawType()
Run Code Online (Sandbox Code Playgroud)
我刚刚掌握了通用通配符,以了解我在编写的一段代码中的最后一次未经检查的强制转换警告,我不明白为什么getRawType()返回一个通配符类型.
class Base<T>{}
class Child<T> extends Base<T>{}
public <C> void test (TypeToken<? extends Base<C>> token) {
Class<? extends Base<C>> rawType = (Class<? extends Base<C>>) token.getRawType();
}
Run Code Online (Sandbox Code Playgroud)
我必须在返回一个时抛出token.getRawType()
Class<? super ? extends Base<C>>
Run Code Online (Sandbox Code Playgroud) 场景:您正在为使用 Storage 或 Events 中的自定义类型的自定义Substrate节点开发FRAME 托盘。要与您的自定义 Substrate 节点交互,请使用Polkadot/Substrate 前端
问题:
无法检索指定的块详细信息。createType(Vec):: 结构:“数据”失败:: 无法构造未知类型 YOUR_CUSTOM_TYPE
我经常遇到我想要使用提取器作为解析器的情况,它们对此非常有用,但它看起来永远不正常,通常unapply看起来应该是一个apply.此外,解析提取器可能会妨碍默认提取器.这有什么模式吗?
case class AnID(int: Int) extends AnyVal
object AnID {
def unapply(idString: String): Option[AnID] = "id-([0-9]+)".r match {
case Seq(intString: String) => Try(Integer.parseInt(intString)).map(AnID.apply).toOption
case _ => None
}
}
Run Code Online (Sandbox Code Playgroud)
并测试:
AnID(8) should be (AnID(8))
val AnID(id1) = "id-1"
id1 should be (AnID(1))
val AnID(id2) = AnID(2)
id2 should be (2)
Run Code Online (Sandbox Code Playgroud)
这有点奇怪.