gpt4 book ai didi

C# 到 Java : where T : new() Syntax

转载 作者:搜寻专家 更新时间:2023-11-01 01:58:25 26 4
gpt4 key购买 nike

我正在将一些 C# 代码移植到 Java。我在使用 where 语法时遇到问题,特别是 new()。我理解 where 类似于 Java 的泛型:T extends FOO。

如何在 Java 中复制 new() 参数?

"The new() Constraint lets the compiler know that any type argument supplied must have an accessible parameterless--or default-- constructor." - MSDN

即:

public class BAR<T> : BAR
where T : FOO, new()

以下是我如何实现 cletus 的解决方案:

public class BAR<T extends FOO> extends ABSTRACTBAR {
public BAR(T t) throws InstantiationException, IllegalAccessException{
t.getClass().newInstance();
this.value = t;
}
}

最佳答案

您不能在 Java 中复制它,因为 C# 和 Java 之间的泛型根本不同。 Java 使用类型删除,因此泛型类型参数不会(大部分)在运行时保留。如果你想构造泛型参数的元素,那么你需要传入一个类实例:

public class Bar<T extends Foo> {
private final Class<T> clazz;

public class Bar(Class<T> clazz) {
this.clazz = clazz;
}

public T newInstance() {
return clazz.newInstance(); // this will throw checked exceptions
}
}

编辑:只是为了解决泛型类型参数的运行时类型安全问题:显然 Java 原生没有它,因为类型删除:没有运行时泛型类型参数的类型。但是有一个解决方案。您使用 Collections.checkedList() :

List<String> list = Collections.checkedList(new ArrayList<String>(),
String.class);

如果您尝试插入不是 String 的内容,此集合现在将抛出异常。

关于C# 到 Java : where T : new() Syntax,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2619429/

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