首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Xamarin mapsforge绑定泛型集合问题

Xamarin mapsforge绑定泛型集合问题
EN

Stack Overflow用户
提问于 2013-06-14 17:49:47
回答 2查看 1.1K关注 0票数 1

我正在尝试绑定mapsforge JAR。在这个库的Overlay类中有许多泛型集合。Overlay类实现了Java.Util.IList,接口Java.Util.IList想要这样实现

代码语言:javascript
运行
复制
"Mapsforge.Android.Maps.OverlayNs.OverlayList" does not implement "Java.Util.IList.AddAll(int, System.Collections.ICollection)" 8 23 MapForgeDroid

因此,我创建了Metadata.xml Mapsforge.Android Mapsforge.Android.Maps.OverlayNs

代码语言:javascript
运行
复制
  <!-- Return Java.Lang.Object in OverlayManager so that we match interface. -->
    <attr path="/api/package[@name='org.mapsforge.android.maps.overlay']/class[@name='ArrayCircleOverlay']/method[@name='createCircle']" name="managedReturn">Java.Lang.Object</attr>
  <attr path="/api/package[@name='org.mapsforge.android.maps.overlay']/class[@name='ArrayItemizedOverlay']/method[@name='createItem']" name="managedReturn">Java.Lang.Object</attr>
  <attr path="/api/package[@name='org.mapsforge.android.maps.overlay']/class[@name='ArrayWayOverlay']/method[@name='createWay']" name="managedReturn">Java.Lang.Object</attr>   

    <attr path="/api/package[@name='org.mapsforge.android.maps.overlay']/class[@name='ArrayItemizedOverlay']/method[@name='getThreadName']" name="visibility">protected</attr>
    <attr path="/api/package[@name='org.mapsforge.android.maps.overlay']/class[@name='ArrayCircleOverlay']/method[@name='getThreadName']" name="visibility">protected</attr>
  <attr path="/api/package[@name='org.mapsforge.android.maps.overlay']/class[@name='ArrayWayOverlay']/method[@name='getThreadName']" name="visibility">protected</attr>

  <attr path="/api/package[@name='org.mapsforge.android.maps.overlay']/class[@name='OverlayList']/method[@name='add' and count(parameter)=1]/parameter[@name='p0']" name="managedType">Java.Lang.Object</attr>
  <attr path="/api/package[@name='org.mapsforge.android.maps.overlay']/class[@name='OverlayList']/method[@name='add' and count(parameter)=2]/parameter[@name='p1']" name="managedType">Java.Lang.Object</attr>
  <attr path="/api/package[@name='org.mapsforge.android.maps.overlay']/class[@name='OverlayList']/method[@name='retainAll']/parameter[@name='p0']" name="managedType">System.Collections.ICollection</attr>
  <attr path="/api/package[@name='org.mapsforge.android.maps.overlay']/class[@name='OverlayList']/method[@name='removeAll']/parameter[@name='p0']" name="managedType">System.Collections.ICollection</attr>
  <attr path="/api/package[@name='org.mapsforge.android.maps.overlay']/class[@name='OverlayList']/method[@name='containsAll']/parameter[@name='p0']" name="managedType">System.Collections.ICollection</attr>
  <attr path="/api/package[@name='org.mapsforge.android.maps.overlay']/class[@name='OverlayList']/method[@name='addAll' and count(parameter)=1]/parameter[@name='p0']" name="managedType">System.Collections.ICollection</attr>
  <attr path="/api/package[@name='org.mapsforge.android.maps.overlay']/class[@name='OverlayList']/method[@name='addAll' and count(parameter)=2]/parameter[@name='p1']" name="managedType">System.Collections.ICollection</attr>

  <attr path="/api/package[@name='org.mapsforge.android.maps.overlay']/class[@name='OverlayList']/method[@name='set']/parameter[@name='p1']" name="managedType">Java.Lang.Object</attr>
  <attr path="/api/package[@name='org.mapsforge.android.maps.overlay']/class[@name='OverlayList']/method[@name='set']" name="managedReturn">Java.Lang.Object</attr>
  <attr path="/api/package[@name='org.mapsforge.android.maps.overlay']/class[@name='OverlayList']/method[@name='get']" name="managedReturn">Java.Lang.Object</attr>
  <attr path="/api/package[@name='org.mapsforge.android.maps.overlay']/class[@name='OverlayList']/method[@name='remove' and count(parameter)=1 and parameter[1][@type='int']]" name="managedReturn">Java.Lang.Object</attr>

  <attr path="/api/package[@name='org.mapsforge.android.maps.overlay']/class[@name='OverlayList']/method[@name='subList']" name="managedReturn">System.Collections.IList</attr>

  <attr path="/api/package[@name='org.mapsforge.android.maps.mapgenerator']/class[@name='MapGeneratorJob']/method[@name='compareTo']/parameter[@name='p0']" name="managedType">Java.Lang.Object</attr>
  <attr path="/api/package[@name='org.mapsforge.core']/class[@name='GeoPoint']/method[@name='compareTo']/parameter[@name='p0']" name="managedType">Java.Lang.Object</attr>
</metadata>

但是出现了许多新的错误-所有的方法都需要泛型集合:

代码语言:javascript
运行
复制
error CS1502: The best overloaded method match for  "Mapsforge.Android.Maps.OverlayNs.OverlayList.AddAll(int, System.Collections.ICollection)" has some invalid arguments   
error CS1503: Argument "2": cannot convert from "System.Collections.Generic.ICollection<Mapsforge.Android.Maps.OverlayNs.Overlay>" to "System.Collections.ICollection"     
error CS1502: The best overloaded method match for "Mapsforge.Android.Maps.OverlayNs.OverlayList.AddAll(System.Collections.ICollection)" has some invalid arguments    
error CS1503: Argument "1": cannot convert from "System.Collections.Generic.ICollection<Mapsforge.Android.Maps.OverlayNs.Overlay>" to "System.Collections.ICollection"     
error CS1502: The best overloaded method match for "Mapsforge.Android.Maps.OverlayNs.OverlayList.ContainsAll(System.Collections.ICollection)" has some invalid arguments    
error CS1503: Argument "1": cannot convert from "System.Collections.Generic.ICollection<object>" to "System.Collections.ICollection"     
error CS1502: The best overloaded method match for "Mapsforge.Android.Maps.OverlayNs.OverlayList.RemoveAll(System.Collections.ICollection)" has some invalid arguments    
error CS1503: Argument "1":  cannot convert from "System.Collections.Generic.ICollection<object>" to "System.Collections.ICollection"     
error CS1502: The best overloaded method match for "Mapsforge.Android.Maps.OverlayNs.OverlayList.RetainAll(System.Collections.ICollection)" has some invalid arguments    
error CS1503: Argument "1": cannot convert from "System.Collections.Generic.ICollection<object>" to "System.Collections.ICollection"     
error CS0266: Cannot implicitly convert type "System.Collections.Generic.IList<Mapsforge.Android.Maps.OverlayNs.Overlay>" to "System.Collections.IList".    
error CS0266: Cannot implicitly convert type "System.Collections.Generic.IList<Mapsforge.Android.Maps.OverlayNs.Overlay>" to "System.Collections.IList".

如果我将类型从System.Collections.ICollection更改为System.Collections.Generic.ICollection,则会生成“未实现”错误。我能做些什么来解决这个问题?

EN

回答 2

Stack Overflow用户

发布于 2016-10-28 23:36:45

在我上一个Xamarin android项目中,我遇到了同样的问题,因为我必须绑定一个大量使用Java泛型的JAR。

首先,您可以阅读以下bugzilla上公开的bug (https://bugzilla.xamarin.com/show_bug.cgi?id=19740),它与Java泛型的绑定问题有关。在该主题中,解释了Android可调用包装器生成器的限制,以及如果需要绑定使用Java泛型的Jar时可以实现的可能解决方案。

在我看来,只有当你的Jar没有大量使用泛型时,这个解决方案才是合适的,这意味着如果你只有一个泛型类,这可能是最好的解决方案。

为了克服最初的问题,我使用了另一种方法,因为我绑定的Jar使用了几个我需要在Xamarin项目中调用的泛型类。我的方法很简单,就是在原生端工作。这意味着将Jar包含在Java项目中,扩展具有特定类型的泛型类。

注意:此实现的要求是您必须知道所需的泛型类型。

为了清楚起见,假设您的原始Jar (名为genericJar )包含一个名为Event<T>的泛型类,并且您知道T可以是"A“类型或"B”类型。

您需要做的是创建一个包含you Jar的Java项目,然后在此项目中创建以下类:

  • public class EventA extends Event <A> {...}
  • public class EventB extends Event <B> {...}

完成此操作后,您可以从该java项目创建一个Jar,并将其用作Xamarin Android项目的起始Jar。binding项目将尝试绑定原始的Event<T>类,给出原始的错误。为了避免这种情况,您必须在binding项目中使用Metadata.xml。在Metadata.xml中,您必须添加以下代码行来告诉Xamarin避免绑定泛型类:

代码语言:javascript
运行
复制
<remove-node path="/api/package[@name='com.originalJar.event']" />

完成此操作后,您将能够生成Xamarin项目所需的DLL,在其中您将能够使用EventA和EventB类,从而避免泛型问题。

我发现这是目前绑定Java泛型类的最佳方法,让我知道这是否能帮助您解决您的问题;)

票数 1
EN

Stack Overflow用户

发布于 2013-09-25 03:07:49

我找到了解决方案(并且成功了!)

首先:删除所有OverlayList节点并添加以下内容:

代码语言:javascript
运行
复制
<remove-node path="/api/package[@name='org.mapsforge.android.maps.overlay']/class[@name='OverlayList']" />

这移除了直接使用OverlayList的能力,但允许库工作。

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

https://stackoverflow.com/questions/17105713

复制
相关文章

相似问题

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