首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Xamarin:在绑定jar库时,没有getXXX()/setXXX()的公共字段失去了它的泛型

Xamarin:在绑定jar库时,没有getXXX()/setXXX()的公共字段失去了它的泛型
EN

Stack Overflow用户
提问于 2014-05-22 03:39:16
回答 2查看 285关注 0票数 2

在罐子里:

代码语言:javascript
复制
public List<CloudPoiInfo> poiList;

但是Xamarin以System.Collections.IList poiList的形式生成了代码,System.Collections.Generic.IList<Com.Baidu.Mapapi.Cloud.CloudPoiInfo> myClassList是对的。

我试过了

代码语言:javascript
复制
<attr path="/api/package[@name='com.baidu.mapapi.cloud']/class/field[@type-generic-aware='java.util.List&lt;com.baidu.mapapi.cloud.CloudPoiInfo&gt;']" name="type">System.Collections.Generic.IList&lt;Com.Baidu.Mapapi.Cloud.CloudPoiInfo&gt;</attr>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-23 01:49:51

我已经修好了:

Metadata.xml

代码语言:javascript
复制
<remove-node path="/api/package[@name='com.baidu.mapapi.cloud']/class[@name='CloudSearchResult']/field[@name='poiList']"/>

{project}/Additions/CloudSearchResult.cs

代码语言:javascript
复制
using Android.Runtime;
using System;
using System.Collections;
using System.Collections.Generic;

namespace Com.Baidu.Mapapi.Cloud
{
    public partial class CloudSearchResult : BaseSearchResult
    {
    static IntPtr poiList_jfieldId;

    // Metadata.xml XPath field reference: path="/api/package[@name='com.baidu.mapapi.cloud']/class[@name='CloudSearchResult']/field[@name='poiList']"
    [Register("poiList")]
    public global::System.Collections.Generic.IList<CloudPoiInfo> PoiListX
    {
        get
        {
        if (poiList_jfieldId == IntPtr.Zero)
            poiList_jfieldId = JNIEnv.GetFieldID(class_ref_2, "poiList", "Ljava/util/List;");
        IntPtr __ret = JNIEnv.GetObjectField(Handle, poiList_jfieldId);
        return global::Android.Runtime.JavaList<CloudPoiInfo>.FromJniHandle(__ret, JniHandleOwnership.TransferLocalRef);
        }
        set
        {
        if (poiList_jfieldId == IntPtr.Zero)
            poiList_jfieldId = JNIEnv.GetFieldID(class_ref_2, "poiList", "Ljava/util/List;");
        IntPtr native_value = global::Android.Runtime.JavaList<CloudPoiInfo>.ToLocalJniHandle(value);
        JNIEnv.SetField(Handle, poiList_jfieldId, native_value);
        JNIEnv.DeleteLocalRef(native_value);
        }
    }

    internal static new IntPtr java_class_handle_2;
    internal static new IntPtr class_ref_2
    {
        get
        {
        return JNIEnv.FindClass("com/baidu/mapapi/cloud/CloudSearchResult", ref java_class_handle_2);
        }
    }
    }

    public abstract partial class BaseSearchResult : Java.Lang.Object
    {
    }

    public partial class CloudPoiInfo : Java.Lang.Object
    {
    }
}
票数 1
EN

Stack Overflow用户

发布于 2014-05-22 12:31:18

Java和C#中的泛型非常不同,因此没有泛型的IList实际上是正确的。这是由于Java端的类型擦除造成的。

Java

泛型在编译时检查类型正确性.然后,在称为类型擦除的过程中删除泛型类型信息。例如,列表将转换为非泛型类型列表,该列表通常包含任意对象.编译时检查确保生成的代码类型正确. 由于类型擦除,无法在运行时确定类型参数.例如,在运行时检查ArrayList时,无法确定在类型擦除之前它是ArrayList还是ArrayList。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23797436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档