繁体   English   中英

Xamarin Android绑定到继承通用类型的Java类型

[英]Xamarin Android Binding to Java Type which inherits Generic Type

我正在寻找以下问题的解决方法。 给定Java中的类层次结构:

public interface Bar<T> { 
    getValue<T>();
}

public abstract class BarImpl<T> implements Bar<T> {

}

public class Foo extends BarImpl<Double> {
    @override 
    public Double getValue() {
        // .. 
    }
}

Xamarin.Android生成包装器,如下所示:

// Now in C# land
public interface Bar 
{
    // Xamarin.Android omits T Value { get; }
}

public partial abstract class BarImpl : Bar  
{
    // Xamarin.Android omits abstract T Value { get; }
}

public partial class Foo : BarImpl
{
    // COMPILE ERROR HERE. No method to override
    public override java.lang.Double Value 
    {
        get { /* ... */ }
    }
}

现在,我很清楚Java编译会去除泛型信息,因此,这实际上不是一个容易解决的问题,但我想知道是否:

  • 任何人都在java.android中遇到过类似的问题

  • 您采用了哪些巧妙的解决方案来绑定此类层次结构?

我只对Foo上的Value的获取方法(绑定的C#类)感兴趣,并且对通过基本接口访问它的某种方式感兴趣(广播可以)。

生成器生成部分类。 扩展这些可能是一种解决方案。 您要做的就是将文件添加到Additions文件夹中,并将您的东西投放到部分类中。 我的想法如下所示:

// custom interface
public interface IMyBar<T> : Bar<T>
{
    public T Value { get; }
}

// extend the partial base class
public partial abstract class BarImpl : IMyBar<Java.Lang.Double>  
{
    public abstract Java.Lang.Double Value { get; }
}

// compiler generates the rest
public partial class Foo
{
    // COMPILE ERROR HERE. No method to override
    public override Java.Lang.Double Value 
    {
        get { /* ... */ }
    }
}

我最终走了另一条路线,并围绕这些通用接口创建了自己的Java包装程序,这样事情就可以绑定在一起而不会出现问题。 因此,我没有使用提供的从泛型继承的接口,而是创建了自己的不继承的接口,并将其传递给包装了先前接口的java方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM