我想说得具体一点。我有一个名为Result的类和一个名为Result的派生类
public class Result
{
public string Message { get; set; }
public bool Success { get; set; }
}
public class Result<T> : Result
{
public T Data { get; set; }
}
这些类在方法中用作返回类型。为此,我创建了这个helper类:
public class ResultManager
{
/// <summary>
/// Returns a success action
/// </summary>
public static Result Success()
{
var result = new Result { Success = true };
return result;
}
/// <summary>
/// Returns a success action
/// </summary>
/// <typeparam name="T">The object type to return with the result</typeparam>
public static Result<T> Success<T>(T data)
{
var result = new Result<T> { Success = true, Data = data };
return result;
}
/// <summary>
/// Returns a failed result
/// </summary>
public static Result Failed(string errorMessage = null, Exception exception = null)
{
// ... unrelevant code for the question
return new Result { Success = false, Message = errorMessage };
}
}
正如您所看到的,上面的代码对于成功有两种返回类型,一种是如果您不想返回任何东西,另一种是如果您想返回一些东西,但是失败的结果永远不会返回什么东西。这是不必要的,只是一个错误消息。这使我想到以下问题:当我想创建一个可以使用返回类型返回Success,而不使用返回类型返回failed的方法时,我如何转换它来确定返回类型是Success(泛型)还是failed?像这里的这个方法:
// The return type of the method is Result, because Result<T> derives from it
public static Result GetClipboardFromDateTime(DateTime dateTime)
{
// Search for items
IEnumerable<ClipboardCopy> items = null;
try
{
items = mClipboardCollection.Where(a => a.CopiedTime == dateTime);
}
catch (Exception ex)
{
// This will return the class "Result"
return ResultManager.Failed(
"Something went wrong getting copies from the clipboard.", ex);
}
// If there is not values
if (items.Count() <= 0)
return ResultManager.Failed("There are not copies with that datetime.");
// Return values
// This will return the class Result<T>
return ResultManager.Success(items.ToArray());
}
实际上,我正在这样做:
var clipboard2 = (Result<ClipboardCopy[]>)AClipboard.GetClipboardFromDateTime(DateTime.Today);
如果返回类型是Result(generic),这将起作用,但如果返回类型是return,它将崩溃,但例外情况是:
System.InvalidCastException:“无法将对象从类型”AdvancedClipboard.Desktop.Models.Result“转换为类型”AdvancedClipboard.Desktop.Models.Result“.结果`1[AdvancedClipboard.Desktop.Models.ClipboardCopy[]]”.“
有一个问题是,您正在尝试预先转换。方法返回两种类型的结果。
我觉得你应该做这样的事。
var result = AClipboard.GetClipboardFromDateTime(DateTime.Today);
if(Result.Success)
{
var dataResult = (Result<ClipboardCopy[]>) result;
}
如果你不想选角的话。还有另一种方法,但我不建议。
var result = AClipboard.GetClipboardFromDateTime(DateTime.Today);
if(result.Success)
{
dynamic d = result.Data;
}
上面的示例动态,您不需要进行强制转换,但同时您放松了对数据的强类型访问。主要是在你做互操作工作的时候建议。如果您可以取消强类型访问,那么您可以使用它。还有一点,任何与此相关的错误都将在运行时执行。
我在我的一个实用程序类中有一个方法,它接受一个集合和一个类对象,并返回一个Iterable实例,该实例可以遍历作为指定类实例的集合的所有成员。其签名为: 这对于大多数用例都非常有效,但现在我需要将其与泛型类
我有一个类似于Pairs的类。我有一个特性,可以将这个类转换成Json格式。 当我使用这个特性时,我得到了以下错误,即对于
我正在修改open JDK以添加特性,我已经遇到了两次,但没有好的解决方案。
编译时,此代码将产生以下+错误: 问题是访问中的类型T与列表中的T不相同。如何修复此编译问题?
我正在尝试有一个通量通用转换器使用通用类型在Java 8。我把我的代码建立在这个答案的基础上。其思想基本上是实现这个特定的转换器->: 类型转换器->转换为我想要的任何类型。因此,我正在使用构造函数创建一个类型为的类,并返回一个方法。我想在调用上创建类似这样的多个条目:,但类类型不同。但它甚至对整数也不起作用。 当我使用此单元测试进行测试时,我得到错误:。
我正在创建一个由数组支持的泛型类型堆栈。当我尝试创建泛型类型数组时,Java不允许我这样做。有人告诉我,我必须创建一个类型为Object的数组,并将其转换为泛型类型。我已经将对象数组转换为类型,但如何处理Java不断给我的未检查类型错误? 这就是我目前所处的位置。 更新:我正在创建一个对象数组,然后在方法的末尾将返回类型转换为T类型。