HarmonyOS 鸿蒙Next 为什么定义了类型,用instanceof判断类型时还是object?

发布于 1周前 作者 zlyuanteng 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 为什么定义了类型,用instanceof判断类型时还是object?

为什么定义了类型,用instanceof判断类型时还是object?

3 回复

【前置】

1、动态类型语言(如ArkTS、 JavaScript、Python、Ruby)

在运行时才进行类型检查。这意味着变量的类型是在赋值时确定的,而不是在声明时确定的。因此,你可以在运行时改变变量的类型。

2、静态类型语言(如Java、C++、GO)

在编译时进行类型检查,变量的类型在声明时就已经确定,并且在程序运行过程中不能改变。

【分析】

示例

type Person = {
  name: string;
  age: number;
};

const person: Person = { name: ‘Alice’, age: 30, };

if (person instanceof Object) { console.log(‘person is an object’); }

由于ArkTS属于动态类型语言,运行时类型信息丢失:编译后的 ArkTS 代码中,所有的类型信息都被移除了。运行时环境中没有 Person 这个类型的概念,只有对象。

可以结合class-transformer和reflect-metadata三方插件,可以参考如下代码

//ohpm install class-transformer
//ohpm install reflect-metadata

import ‘reflect-metadata’; import { plainToClass, Type as Type2 } from ‘class-transformer’;

//1、接口返回的数据 interface IUser { id:number; name:string; age:number }

export default interface BaseResult<T> { Code: number Msg: string Result?: T[] Cryption: number }

let Result:BaseResult<IUser> = { Code: 200, Msg: ‘success’, Cryption: 0, Result: [ { id:1, name:‘wangyiyi’, age:18 }, { id:2, name:‘zhaoshiyi’, age:20 },

] }

//1、根据接口返回的数据做处理 @Observed export class User{ id:number; name:string; age:number

constructor(id:number, name:string,age:number) { this.id = id this.name = name this.age = age

} }

class ResponseObj { Code: number Msg: string Cryption: number @Type2(() => User) Result: User[] = []; constructor(Code: number, Msg: string,Cryption:number, Result?: User[]) { this.Code = Code this.Msg = Msg this.Cryption = Cryption this.Result = Result as User[] } }

@Entry @Component struct Index { @State message: string = ‘Hello World’; @State list: User[] = [];

aboutToAppear(): void { let ResultStr = JSON.stringify(Result) //接口返回的字符串 let jsonData: BaseResult<IUser> = JSON.parse(ResultStr) let responseObj: ResponseObj = plainToClass(ResponseObj, jsonData); console.log( <span class="hljs-number">00000000</span>--- ${<span class="hljs-built_in">JSON</span>.stringify(responseObj)}) this.list = this.list.concat(responseObj.Result); }

build() { Column() { ForEach(this.list, (item: User, index: number) => { ViewA({ item: item }) }) } .height(‘100%’) .width(‘100%’) } }

@Component export struct ViewA { @ObjectLink item: User build() { Row(){ Button(${<span class="hljs-keyword">this</span>.item.name}).onClick(() =>{ this.item.name = this.item.name + ‘11’ }) }.margin({top : 10 }) } }

在HarmonyOS鸿蒙Next的开发中,如果你在使用instanceof关键字判断一个对象的类型时返回的是object,这通常意味着你正在检查的对象在运行时被识别为Java的根类型Object。这种情况可能由以下几个原因引起:

  1. 类型擦除:如果你在使用泛型或继承体系时遇到此问题,可能是因为Java的泛型类型擦除机制。泛型信息在编译时会被擦除,只保留原始类型Object

  2. 动态类型:对象可能是在运行时通过反射或其他动态方式创建的,其实际类型没有在编译时被正确识别。

  3. 类加载问题:类加载器可能没有正确加载你期望的类,导致对象被视为Object

  4. 代码错误:检查你的代码,确保你没有错误地将对象显式转换为Object,或者在判断前进行了不恰当的类型转换。

确保你检查的类已经正确导入,并且对象确实是你期望的类型实例。同时,验证你的编译和运行环境是否一致,以及是否有任何类加载器相关的特殊配置。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部