gpt4 book ai didi

java - 将 Java 对象类型转换为我的类

转载 作者:太空宇宙 更新时间:2023-11-03 21:10:42 24 4
gpt4 key购买 nike

使用 Xamarin 在 C# .Net 4.5 中开发面向 Android 的应用程序。我有一个自定义类,其中包含一些属性。我正在尝试使用一个内置组件,该组件使用 Java.Util.IComparator 和 Java.Lang.Object 进行比较。因为它是一个内置组件,所以我没有太多的灵 active 来更改这两项。

我的自定义类名为 recBatch,在其中,我有一些整数和字符串的属性。

这是组件初始化的地方。基本上每次用户单击第 0 列的标题时,它都会调用一个方法。

tableView.SetColumnComparator(0, GetBatchIdComparator());

这是组件调用的方法

公共(public) Java.Util.IComparator GetBatchIdComparator()
{
返回新的 BatchIdComparator();
}

最后,这是调用返回的类。

public class BatchIdComparator : Java.Lang.Object, Java.Util.IComparator
{


public int Compare(Java.Lang.Object lhs, Java.Lang.Object rhs)
{
var leftID = (recBatch)lhs;
var rightID = (recBatch)rhs;

return leftID.Batch.CompareTo(rightID.Batch);
}


}

我在上面尝试通过强制转换来做的第一件事给我一个错误,如此处所示。我确实尝试了 Visual Studio 的建议,但也无法使其正常工作。

Error saying cannot cast from object to recBatch

我尝试的下一件事是创建一个像这样的新类,并将转换从我的实际类 recBatch 更改为这个新类以进行转换:

 public class BatchIdComparator : Java.Lang.Object, Java.Util.IComparator

{


public int Compare(Java.Lang.Object lhs, Java.Lang.Object rhs)
{
var leftID = (castClass)lhs;
var rightID = (castClass)rhs;

return leftID.BatchData.Batch.CompareTo(rightID.BatchData.Batch);
}


}

public class castClass : Java.Lang.Object
{
public castClass(recBatch batchData)
{
batchData = BatchData;
}

public recBatch BatchData { get; private set; }
}

有了这个,我就没有错误并且可以编译了,但问题是我在运行时遇到了强制转换异常。代码确实可以编译,并且因为我正在转换,所以我确实可以访问 recBatch 中的属性之一(Batch 或 recBatch.Batch)。但是,我再次遇到强制转换异常。确切的错误是:

Cast Exception

基本上,我只需要将 Java.Lang.Object 转换为 recBatch,但我想我做错了。一切都正确地“连接起来”,因为如果我在 Compare 方法上放置一个断点,它会命中并且传入的 lhs、rhs 参数中有我的类数据(即 Batch),即使它们是 Java.Lang。对象类型。

感谢任何帮助!

谢谢!

最佳答案

所有,对于那些可能感兴趣的人,我有一个解决方案,它已经到位并且运行良好。又花了一天时间在我的评论中寻找一些提示和其他一些线索。

基本上,我创建了另一个专门负责转换我的 Java 对象的类。可能不需要在类里面这样做,但是哦,好吧。这是里面包含的类和方法:

public class CastJavaObject
{
public static T Cast<T>(Java.Lang.Object obj) where T : recBatch
{
var propInfo = obj.GetType().GetProperty("Instance");
return propInfo == null ? null : propInfo.GetValue(obj, null) as T;
}
}

然后,我所要做的就是调用它并传入 Java 对象,就像那样,lhsCopy 和 rhsCopy 属于我的类,recBatch 而不是 Java 对象,因此,我可以访问所有属性。我没有收到任何异常或注意到任何性能问题。但是,如果有人对此方法有任何意见,请随意。

我是这样调用它的:

    public int Compare(Java.Lang.Object lhs, Java.Lang.Object rhs)
{
var lhsCopy = CastJavaObject.Cast<recBatch>(lhs);
var rhsCopy = CastJavaObject.Cast<recBatch>(rhs);

谢谢!

迈克

关于java - 将 Java 对象类型转换为我的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37956507/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com