gpt4 book ai didi

java - 什么是 C# default(T) 的 Java 等价物

转载 作者:搜寻专家 更新时间:2023-10-31 19:32:54 24 4
gpt4 key购买 nike

我目前正在为我的一个项目进行通用总和投影。代码就像,

public class Sum<T,U extends Number> implements IProject<T,U,U>
{
@Override
public U eval(Iterable<T> tList, Function<T,U> property)
{
U total;
for (T t : tList)
{
total += property.apply(t);
}
return total;
}
}

但是这里有一点小问题,因为我需要初始化总数(显然是 0)。但是无论如何都可以像在 C# 中那样在 Java 中执行此操作吗?我可以使用 default(U)

最佳答案

Java 等同于 C# 的 default(T)null,这显然不适用于您的情况,因为您第一次尝试添加时会得到 NullPointerException一些东西到你的总数。

为了初始化你的总数,你需要一个 java 工厂方法,但它仍然不起作用,因为:

  1. 您不能在 java 中对泛型使用 +=
  2. java.lang.Number 是不可变的,因此您不能向它添加任何内容。

您有两个选择。

大规模过度设计的方法:

定义一个名为 MyNumber 的新接口(interface),其中包含一个 add 方法,并编写相关联的非不可变数字类来实现该接口(interface),这样您的代码就会看起来像这样:

@Override
public <T extends MyNumber> T add( T total, Iterable<T> myNumbers )
{
for( T myNumber : myNumbers )
total.add( myNumber );
return total;
}

(您还需要编写一个工厂,以便您可以创建一个实例来保存您的总数,而无需确切知道它是什么类型。)

务实的方法:

像这样编写级联的 if 语句:

if( number instanceof Integer )
{
//declare int total
//loop to sum integers
//box the total into a Number
}
else if( number instanceof Long )
{
//declare long total
//loop to sum longs
//box the total into a Number
}
...

关于java - 什么是 C# default(T) 的 Java 等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28515268/

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