小编Nat*_*ate的帖子

如何处理多态的反序列化?

我有一个类:

public class Barn {
    String type;
    Animal animal;
}

public class Horse extends Animal {
}

public class Cow extends Animal {
}
Run Code Online (Sandbox Code Playgroud)

我想序列化它们的列表:

List<Barn> barns = new ArrayList<Barn>();

Barn barn1 = new Barn();
barn1.setType("horse");
barn1.setAnimal(new Horse());
barns.add(barn1);

Barn barn2 = new Barn();
barn2.setType("cow");
barn2.setAnimal(new Cow());
barns.add(barn2);

...

Group<Barn> barns = gson.fromJson(serialized);   
Run Code Online (Sandbox Code Playgroud)

当我序列化时,Animal属性的类型信息将丢失.有没有办法我可以以某种方式安装解析器监听器,以便我可以提供正确的类来反序列化,因为遇到列表中的每个元素?这就是手动提供描述类类型的字符串的想法.

谢谢

java gson

27
推荐指数
3
解决办法
1万
查看次数

如何重新排序已排序的数组,其中一个元素更新

我有恒定大小的数组(现实生活中的大小 = 20),允许重复例如:

1 2 2 3 3 4 5 6 7 8 9
Run Code Online (Sandbox Code Playgroud)

现在只有一个元素更新:

1 5 2 3 3 4 5 6 7 8 9
Run Code Online (Sandbox Code Playgroud)

我需要使用这个数组。我应该只使用冒泡排序吗?

更新我不知道如何称呼我写的东西。但我想不可能更快地排序。欢迎评论!

    // array is already almost sorted and INCREASING, element at pos need to be inserted to the right place
    private void SortQuotes(List<Quote> quoteList, int pos)
    {
        var quoteToMove = quoteList[pos];
        if (pos == 0 || quoteList[pos - 1].Price < quoteToMove.Price)
        {
            MoveElementsDown(quoteList, pos);
        } else if (pos == quoteList.Count - 1 …
Run Code Online (Sandbox Code Playgroud)

java sorting algorithm

5
推荐指数
1
解决办法
3741
查看次数

如何检查 Scala HigherKinded TypeTag 是否为数组?

我正在尝试将类型标记转换为维护/保留正常擦除类型参数的 Java 类。有不少库受益于此类转换(例如 Jackson 和 Guice)。我目前正在尝试将Manifest基于代码的代码迁移到,TypeTag因为Manifests 对于某些极端情况是不够的。

与其他数据类型相比,JVM 将数组视为特殊的。aclassOf[Int]和之间的区别在于classOf[Array[Int]]该方法Class.isArray()将为后者返回true。

Manifest实施很简单。Manifest.erasure是一个已经有效/真实的Class实例isArray()

TypeTag实施是棘手。没有快速简便的erasure方法。事实上,“类似”的 TypeTag 变体,RuntimeMirror.runtimeClass不喜欢代表我们处理创建任何基于 Array 的类。阅读文档:

注意:如果Scala符号是ArrayClass,会抛出ClassNotFound异常,因为没有唯一的Java类对应一个Scala泛型数组

为了解决这个问题,我尝试检测它是否是一个数组。如果它是一个数组,那么我手动创建类对象。但是,当 Array 具有未知类型参数时,我遇到了一个额外的边缘情况。

首先让我向您展示一个不是 HigherKinded 类型的示例。

import scala.reflect.runtime.universe._
class A[T]

val innerType = typeOf[A[Array[_]]].asInstanceOf[TypeRefApi].args.head
innerType <:< typeOf[Array[_]] // Returns true.
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好。

class B[T[_]]

val innerType = typeOf[B[Array]].asInstanceOf[TypeRefApi].args.head
innerType <:< typeOf[Array[_]] // Returns false.
Run Code Online (Sandbox Code Playgroud)

我无法创建 typeOf[Array] 因为它抱怨缺少参数。如何检测 B 的类型参数为 …

reflection scala

2
推荐指数
1
解决办法
244
查看次数

标签 统计

java ×2

algorithm ×1

gson ×1

reflection ×1

scala ×1

sorting ×1