1

我是 Java 新手,我正在尝试调整 JASN1 OpenMUC编译器(适用于 java 1.5+)生成的输出类以在 BGS5 CLDC 1.1 平台上运行它。大多数基本类都已成功修改和编译,但在使用参数化列表或集合类方面仍然存在问题。它被用于基本类之一,并在大多数生产类中被大量使用。CLDC 1.1 设备的 java 库不支持它。

我的问题有两个分支:

  1. 有没有办法将源代码从标准 java 转换为 J2ME?
  2. 如何将源代码中的参数化列表替换为 Vector 等基本支持的类。

包含参数化 List 成员的目标类的示例是:

//This class file was automatically generated by jASN1 v1.6.0 (http://www.openmuc.org)

package MyPackage;

import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
// those packages are not available

public class DeviceInputOutputStatus {

    public List<IOStatus> seqOf = null;
    //IOStatus is a class of the package

    public DeviceInputOutputStatus () {
        seqOf = new ArrayList<IOStatus>();
    }  

    public int encode(BerByteArrayOutputStream os) throws IOException 
    {
        int codeLength = 0;
        for (int i = (seqOf.size() - 1); i >= 0; i--) {
                codeLength += seqOf.get(i).encode(os, true);
                //encode is a method of IOStatus
            }
        return codeLength;
    }

}
4

1 回答 1

1

您将不得不修改所有生成的代码以不使用泛型。不仅如此,不要使用任何集合类,因为它们在 JavaME CLDC 1.1 中不受支持。

您可以将其视为一个两步过程。首先,摆脱对泛型的使用。为了消除泛型,您将只使用普通列表(后面没有尖括号),然后在需要的地方(例如,每当您从列表中取出对象时)添加强制转换(从 Object 到 IOStatus 或其他)。

第二步:用 Vector 替换 List。您将不得不比较这两个类的文档并相应地调整您的代码。

提示(可能您已经知道这一点):使用 javac 的 -bootclasspath 选项将您的编译器指向 CLDC 1.1 类库,以确保您不使用不受支持的 API 和 -source 1.3 和 -target 1.3 以确保您的源是兼容并且您生成兼容的字节码。

于 2017-01-31T18:32:05.743 回答