【问题标题】:Xamarin Android Binding to Java Type which inherits Generic TypeXamarin Android 绑定到继承通用类型的 Java 类型
【发布时间】:2016-04-10 17:44:54
【问题描述】:

我正在寻找解决以下问题的方法。给定 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# 类)以及通过基本接口访问它的某种方式感兴趣(强制转换即可)。

【问题讨论】:

  • 生成的类不是部分的吗? o0
  • 是的,它们是,但是我如何首先删除 Foo.Value 上的覆盖?
  • 哦...您是说完全排除节点 Foo.Value 并在部分类中声明它? ...
  • 也许或者只是添加一个额外的接口并在你的部分类中实现它
  • ...我会试一试。 Xamarin.Android 对此所做的一切都是一团糟……:/

标签: java c# xamarin xamarin.android


【解决方案1】:

生成器生成部分类。扩展这些可能是一个解决方案。您所要做的就是将文件添加到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 { /* ... */ }
    }
}

【讨论】:

  • 虽然我没有完全使用这个解决方案(由于层次结构比我的问题稍微复杂一些),但它确实为我指出了解决方案,即删除由 Xamarin.Android 创建的虚假节点并在 Additions(部分类)中编写我自己的层次结构。谢谢!!
【解决方案2】:

我最终选择了另一条路线,并围绕这些通用接口创建了自己的 java 包装器,这样事情就可以毫无问题地绑定。 因此,我没有使用从泛型继承的提供的接口,而是创建了自己的不继承的接口,并将它们传递给包装了先前接口的 java 方法。

【讨论】:

    猜你喜欢
    • 2013-03-09
    • 2010-09-24
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多