有没有办法从常规Kotlin类中识别Kotlin数据类?喜欢使用反射可能吗?
了解 Kotlin 后,爱上了data class. 我可以替换具有equalandhash和toStringto 它的Java 类。这些 Java 类中的大多数都是serializable类。所以我的问题是,当我们转换为 时data class,我还需要serializable明确地进行吗?喜欢
data class SomeJavaToKotlinClass(val member: String) : Serializable
Run Code Online (Sandbox Code Playgroud)
或者没关系
data class SomeJavaToKotlinClass(val member: String)
Run Code Online (Sandbox Code Playgroud) 如果属性名称仅在运行时已知,我如何读取Kotlin数据类实例中的属性值?
好了,现在科特林正式出来,我开始再次发挥它,我很困惑,我需要的优点之间进行选择sealed,并data以某种方式,但不能兼得.
例如,这似乎对我有意义,但不编译:
sealed class Expr {
data class Const(val number: Double) : Expr()
data class Sum(val expr1 : Expr, val expr2 : Expr) : Expr()
}
Run Code Online (Sandbox Code Playgroud)
因为数据类不能扩展其他类.
有什么我想念的吗?
以下将起作用,但我宁愿不需要__hash__在每个子类中重复。有没有办法告诉数据类继承哈希函数(即不将其设置为None)?
from dataclasses import dataclass
@dataclass
class Hashable:
def __hash__(self):
hashed = hash((
getattr(self, key)
for key in self.__annotations__
))
return hashed
@dataclass
class Node(Hashable):
name: str = 'Undefined'
def __hash__(self):
return Hashable.__hash__(self)
Run Code Online (Sandbox Code Playgroud) 我目前收到以下错误:
"表单的视图数据应该是Symfony\Component\HttpFoundation\File\File类的实例,但是是一个(n)字符串.您可以通过将"data_class"选项设置为null或添加视图来避免此错误将(n)字符串转换为Symfony\Component\HttpFoundation\File\File的实例的转换器."
SoundController - 上传功能
/**
* @Security("is_granted('IS_AUTHENTICATED_FULLY')")
* @Route("/song/upload", name="upload_song")
* @param Request $request
* @return \Symfony\Component\HttpFoundation\Response
*/
public function uploadSong(Request $request)
{
$song = new Sound();
$form = $this->createForm(SoundType::class, $song);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid())
{
$file = $song->getFile();
$user = $this->getUser();
$fileName = $this
->get('app.file_uploader')
->setDir($this->get('kernel')->getRootDir()."/../web".$this->getParameter('songs_directory'))
->upload($file);
$song->setFile($fileName);
$file = $song->getCoverFile();
if ($file === null)
{
$song->setCoverFile($this->getParameter('default_cover'));
}
else
{
$fileName = $this
->get('app.file_uploader')
->setDir($this->get('kernel')->getRootDir()."/../web".$this->getParameter('covers_directory'))
->upload($file);
$song->setCoverFile($fileName);
}
$song->setUploader($user);
$song->setUploaderID($user->getId());
$user->addSong($song);
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($song);
$entityManager->flush();
return …Run Code Online (Sandbox Code Playgroud) 我正在努力处理数据类和多态.我想从不变性中受益,但仍然能够更新我的状态.为此,我希望能够使用该copy功能.
我们举个例子吧.我有这个类层次结构:
interface Aging {
val age : Int
}
data class Cheese (
override val age : Int
// more Cheese specific properties
) : Aging
data class Wine (
override val age : Int,
val grape : String
// more Wine specific properties
) : Aging
Run Code Online (Sandbox Code Playgroud)
现在我希望能够做这样的事情(但是这不工作):
class RipeningProcess(){
fun ripen(products : List<Aging>) =
// Not possibe, no copy function on Aging
products.map { it.copy(age = it.age + 1) }
}
Run Code Online (Sandbox Code Playgroud)
如何以多态方式创建更新的副本?
我试图给接口一个copy …
我正在使用Gsson转换JSON to Kotlin data class. 在创建数据类对象时,我想解析init方法中的值。但init从未调用和生成的对象的值为空。
data class Configuration (val groupId:Int, val key:String, val source:String){
val query:String
val search:String
init {
val obj = JSONObject(key)
query = obj.getString("q")
search = obj.getString("search")
}
}
Run Code Online (Sandbox Code Playgroud)
当我配置的从对象Gson,query和search值始终null和init永远不会执行块。我也试过 constructor 没有data关键字,结果是一样的。
在创建数据类时,我经常发现我想要转换其中一个属性,通常是将其标准化或制作防御性副本.例如,在这里我想productCode永远是小写的:
data class Product(val productCode: String)
Run Code Online (Sandbox Code Playgroud)
我已经尝试添加一个init块,希望Kotlin足够聪明,让我手动处理构造函数参数赋值给属性:
data class Product(val productCode: String) {
init {
this.productCode = productCode.toLowerCase()
}
}
Run Code Online (Sandbox Code Playgroud)
但它将此视为重新分配.
我宁愿不用手写equals/ hashCode/ toString/ copyIDE生成的方法也不是真的好多了.
有没有办法转换数据类中的构造函数参数?
在Marshmallow为了让你可以使用列表字段:
include_in = fields.List(cls_or_instance=fields.Str(),
default=['sample1', 'sample2'])
Run Code Online (Sandbox Code Playgroud)
这没问题,但我有一个新要求,即在一个领域有一个字典列表。示例有效负载:
[{
"name": "Ali",
"age": 20
},
{
"name": "Hasan",
"age": 32
}]
Run Code Online (Sandbox Code Playgroud)
This payload is part of the bigger schema, so now the question is how should I add and validate such a field?
EDIT-1:
I went a step further and could find out that there is a Dict field type in Marshmallow so until now I have the below code sample:
fields.List(fields.Dict(
keys=fields.String(validate=OneOf(('name', 'age'))),
values=fields.String(required=True)
))
Run Code Online (Sandbox Code Playgroud)
Now new problem arise …
data-class ×10
kotlin ×7
python ×2
hash ×1
marshmallow ×1
nested ×1
php ×1
reflection ×1
symfony ×1