generics 相关问题

泛型是一种参数多态,可以在各种语言中找到,包括.NET语言,Java和Swift。

递归泛型类型

是否可以在 C# 中定义引用自身的泛型类型? 例如。我想定义一个 Dictionary<> ,将其类型保存为 TValue (对于层次结构)。 字典 是否可以在 C# 中定义引用自身的泛型类型? 例如我想定义一个 Dictionary<>,将其类型保存为 TValue(对于层次结构)。 Dictionary<string, Dictionary<string, Dictionary<string, [...]>>> 尝试: class StringToDictionary : Dictionary<string, StringToDictionary> { } 然后你可以写: var stuff = new StringToDictionary { { "Fruit", new StringToDictionary { { "Apple", null }, { "Banana", null }, { "Lemon", new StringToDictionary { { "Sharp", null } } } } }, }; 递归的一般原则:找到某种方法为递归模式命名,以便它可以通过名称引用自身。 另一个例子是通用树 public class Tree<TDerived> where TDerived : Tree<TDerived> { public TDerived Parent { get; private set; } public List<TDerived> Children { get; private set; } public Tree(TDerived parent) { this.Parent = parent; this.Children = new List<TDerived>(); if(parent!=null) { parent.Children.Add((TDerived)this); } } public bool IsRoot { get { return Parent == null; } } public bool IsLeaf { get { return Children.Count==0; } } } 现在就可以使用它 public class CoordSys : Tree<CoordSys> { CoordSys() : base(null) { } CoordSys(CoordSys parent) : base(parent) { } public double LocalPosition { get; set; } public double GlobalPosition { get { return IsRoot?LocalPosition:Parent.GlobalPosition+LocalPosition; } } public static CoordSys NewRootCoordinate() { return new CoordSys(); } public CoordSys NewChildCoordinate(double localPos) { return new CoordSys(this) { LocalPosition = localPos }; } } static void Main() { // Make a coordinate tree: // // +--[C:50] // [A:0]---[B:100]--+ // +--[D:80] // var A=CoordSys.NewRootCoordinate(); var B=A.NewChildCoordinate(100); var C=B.NewChildCoordinate(50); var D=B.NewChildCoordinate(80); Debug.WriteLine(C.GlobalPosition); // 100+50 = 150 Debug.WriteLine(D.GlobalPosition); // 100+80 = 180 } 请注意,您不能直接实例化Tree<TDerived>。它必须是树中节点类的基类。想class Node : Tree<Node> { }。

回答 2 投票 0

我的 Java 泛型测试不起作用!

我正在做一些Java学习,特别是在泛型领域。 我对 C# 中的泛型相当熟悉,但在 Java 中,情况就完全不同了。 我使用了一些效果很好的样本

回答 6 投票 0

根据参数类型返回特定类型的集合

我正在尝试编写一个可以接受 Collection 并返回 Collection 的映射器。这部分很简单,但我正在努力使返回的 Collection 具有相同的类型......

回答 1 投票 0

如何在zig中的结构体字段中进行泛型

我对 zig 很陌生,我想知道如何创建一个可以具有编译时已知类型的结构体字段 例如,与函数参数一起使用时类似于 comptime 关键字的内容,我

回答 1 投票 0

Groovy 编译期间出现 StackOverflowError

这真是折磨我了。 我正在使用 Gradle 编译 Java/Groovy 项目。 在 :compileGroovy 任务期间,我收到 StackOverflowError。 堆栈跟踪如下所示: 导致...

回答 1 投票 0

Lambda 表达式和泛型仅在方法中定义

假设我有一个通用接口: 接口 MyComparable> { 公共 int 比较(T obj1,T obj2); } 以及方法排序: 公共静态 假设我有一个通用接口: interface MyComparable<T extends Comparable<T>> { public int compare(T obj1, T obj2); } 还有一个方法sort: public static <T extends Comparable<T>> void sort(List<T> list, MyComparable<T> comp) { // sort the list } 我可以调用此方法并传递 lambda 表达式作为参数: List<String> list = Arrays.asList("a", "b", "c"); sort(list, (a, b) -> a.compareTo(b)); 这样就可以了。 但是现在如果我将接口设置为非通用,并将方法设置为通用: interface MyComparable { public <T extends Comparable<T>> int compare(T obj1, T obj2); } public static <T extends Comparable<T>> void sort(List<T> list, MyComparable comp) { } 然后像这样调用: List<String> list = Arrays.asList("a", "b", "c"); sort(list, (a, b) -> a.compareTo(b)); 它无法编译。它显示 lambda 表达式错误: “目标方法是通用的” 好的,当我使用javac编译它时,它显示以下错误: SO.java:20: error: incompatible types: cannot infer type-variable(s) T#1 sort(list, (a, b) -> a.compareTo(b)); ^ (argument mismatch; invalid functional descriptor for lambda expression method <T#2>(T#2,T#2)int in interface MyComparable is generic) where T#1,T#2 are type-variables: T#1 extends Comparable<T#1> declared in method <T#1>sort(List<T#1>,MyComparable) T#2 extends Comparable<T#2> declared in method <T#2>compare(T#2,T#2) 1 error 从这个错误消息来看,编译器似乎无法推断类型参数。是这样吗?如果是的话,为什么会出现这样的情况? 我尝试了各种方法,通过互联网搜索。然后我发现了这篇JavaCodeGeeks文章,它展示了一种方法,所以我尝试了: sort(list, <T extends Comparable<T>>(a, b) -> a.compareTo(b)); 这又不起作用,与该文章声称的相反。也许它曾经在某些初始版本中工作过。 所以我的问题是:有没有办法为泛型方法创建 lambda 表达式?不过,我可以通过创建方法来使用方法引用来完成此操作: public static <T extends Comparable<T>> int compare(T obj1, T obj2) { return obj1.compareTo(obj2); } 在某些课程中说 SO,并将其传递为: sort(list, SO::compare); 如果功能接口中的方法具有类型参数,则不能将lambda表达式用于功能接口。请参阅 JLS8 中的第 §15.27.3 节: 如果 T 是函数接口类型(第 9.8 节)并且表达式与 [..] T.[ 的函数类型一致,则 lambda 表达式与目标类型 T 兼容 [..]。 .] 如果满足以下所有条件,则 lambda 表达式与函数类型全等 正确: 函数类型有 没有类型参数。 [..] 使用方法引用,我找到了其他方法来传递参数: List<String> list = Arrays.asList("a", "b", "c"); sort(list, Comparable::<String>compareTo); 只需将编译器指向通用比较器的正确版本即可 (Comparator<String>) 所以答案是 sort(list, (Comparator<String>)(a, b) -> a.compareTo(b)); 你的意思是这样的吗?: <T,S>(T t, S s)->... 这个 lambda 是什么类型?您无法在 Java 中表达这一点,因此无法在函数应用程序中编写此表达式,并且表达式必须是可组合的。 为了完成这项工作,您需要 Java 中对 Rank2 Types 的支持。 方法允许是通用的,但因此不能将它们用作表达式。然而,在传递它们之前,可以通过专门化所有必要的泛型类型来将它们简化为 lambda 表达式:ClassName::<TypeName>methodName List<String> list = Arrays.asList("a", "b", "c"); sort(list, Comparable::<String>compareTo); int compareTo (T o) 不是通用方法调用。虽然 Comparable<T> 是一个带有类型的接口。即使 compareTo 返回了 T,即 T compareTo (T o),它仍然不是通用方法。为了使其成为通用方法,它需要包含 type parameters 列表,即 <T> T compareTo (T o)。 lambda 表达式无法声明类型参数,因此它不能具有抽象方法为泛型的目标类型。 在这种情况下,你需要使用方法参考

回答 6 投票 0

构建通用的 getObjectByID 函数

我构建了一个 Swift 函数,通过特定 SwiftData 类的 id 获取对象,效果很好。现在我尝试将其重建为通用函数以与不同的类一起使用。我的代码看起来像...

回答 1 投票 0

m(List<? super X>) 其中 X 是一个接口

我了解 extends 和 super 在泛型中的工作原理。 根据理论,当方法类似于 m(List) 且 X 是一个接口时,则可以通过类型 X 的列表来调用此方法并且...

回答 1 投票 0

在 Swift 中从嵌套数组创建 ShapedArray

我正在尝试创建一个形状数组结构来处理 Swift 中的 N 维(多维)数值数据。我想使用嵌套数组(数组的数组)创建结构,例如......

回答 1 投票 0

高阶函数泛型的正确 Kotlin 声明

我目前遇到的情况是,我有几个数据类(Script 和 FreeScript),我想在处理数据集的某些代码中以相同的方式处理它们。例如: 脚本的乐趣(

回答 1 投票 0

不安全操作,未经检查的转换

当我编译以下类(可在此处找到,已添加主要方法以在单个类中重现问题)时,我在 IntelliJ 或 maven 命令中收到以下编译器警告...

回答 1 投票 0

为什么scala编译器说这个类型用在不可特化的位置?

我在包对象中有这个方法: def extractLoop[@specialized T](x: Map[T, T]) = { val 无论如何 = x.head val stop = 随便._1 定义迭代( acc: Seq[T] = Seq(whatev...

回答 1 投票 0

参数化类型是什么意思?

此链接说明以下内容: 具有实际类型参数的泛型类型的实例化称为参数化类型。 示例(参数化类型): 收藏

回答 8 投票 0

Java - 通过泛型函数执行实现空安全

在 Java 中处理嵌套对象时 - 像这样的东西: // 错误的代码 game.getPlayer().getState().getPositionInfo().getCurrent().getX(); ,目前尚不清楚嵌套引用是否会返回 null

回答 1 投票 0

在C#中获取空数组在时间和空间方面最有效的方法是什么? [已关闭]

假设我需要 C# 中 Book 类的空数组。 公开课图书 { 公共字符串标题{获取;放; } 公共作者 作者 { get;放; } } 我找到了以下 3 个选项来实现...

回答 2 投票 0

在 C# 中获取空数组的最佳方法

假设我需要 C# 中 Book 类的空数组。 公开课图书 { 公共字符串标题{获取;放; } 公共作者 作者 { get;放; } } 我找到了以下 3 个选项来实现...

回答 2 投票 0

eclipse 编译器或 javac 中的错误?

谁是对的? Eclipse 还是 javac? --------------- c/v/A.java --------------- 包c.v; 公开课 A { } --------------- c/v/B.java --------------- 包c.v; 公共B类延长...

回答 3 投票 0

如何为泛型函数类型定义泛型实例箭头函数

我需要为函数签名定义一种类型,以便在多个函数定义中使用。该类型需要是泛型的,并接收一个将用于转换函数的泛型类型...

回答 1 投票 0

通用数组创建错误

我正在尝试做这样的事情:- 公共静态 ArrayList[] a = new ArrayList[2]; myObject 是一个类。我收到此错误:- 通用数组创建(箭头是

回答 5 投票 0

SwiftUI EditMode 在 ListView 中无法正常工作

TLDR:即使 moveDisabled 修饰符值为 false(动态更新),移动指示器也不会出现在列表编辑模式中。 大家好,我来这里是想问一下 listView 中的 editMode 导致...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.