首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何从泛型方法返回原始集合类型

如何从泛型方法返回原始集合类型
EN

Stack Overflow用户
提问于 2017-11-16 00:53:38
回答 1查看 100关注 0票数 2

我有一个泛型方法,它应该返回与输入类型相同的集合:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def removeN[A, C <: Seq[A]](s: C, n: Int): C = {
  s.take(n) ++ s.drop(n + 1) // Sample operation
}

但是这段代码没有编译:

错误:(34,15)类型错配;发现: SeqA必需:C s.take(n) ++ s.drop(n + 1)

  1. 如果C明确表示Seq[A],这怎么可能?这是否意味着这种连接总是返回父类型Seq[A]的实例,而不是子类型C?可以重写我的代码以生成一个类型为C的集合吗?
  2. 这是否是定义一个泛型方法的正确方法,该方法通常返回与输入相同的集合类型(在我的例子中是Seq的子类型)?

Scala 2.12.4

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-16 02:00:28

您所要求的可以使用集合库中最强大但最具争议的特性之一,即CanBuildFrom来完成。以下是如何:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import scala.language.higherKinds
import scala.collection.generic.CanBuildFrom

def removeN[A, C[A] <: Seq[A]](s: C[A], n: Int)
  (implicit cbf: CanBuildFrom[C[A], A, C[A]]): C[A] = {
  val builder = cbf()
  builder.sizeHint(s.size)
  builder ++= s.take(n)
  builder ++= s.drop(n + 1)
  builder.result()
}

让我们在REPL中做一个转折:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
scala> removeN(List(4, 5, 6), 2)
res0: List[Int] = List(4, 5)

scala> removeN(Vector(4, 5, 6), 2)
res1: scala.collection.immutable.Vector[Int] = Vector(4, 5)

好像很管用。

为了避免对更高类型(CA)的使用发出警告,需要使用import scala.language.higherKinds

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47325295

复制
相关文章
C#泛型入门泛型类、泛型集合、泛型方法、泛型约束、泛型委托
给.neter们整理了一份《.NET/C#面试手册》,目前大约4万字左右,初衷也很简单,就是希望在面试的时候能够帮助到大家,减轻大家的负担和节省时间。对于没有跳槽打算的也可以复习一下相关知识点,就当是查缺补漏!
全栈程序员站长
2022/09/14
2.6K0
C#泛型入门泛型类、泛型集合、泛型方法、泛型约束、泛型委托
【Flutter】Dart 泛型 ( 泛型类 | 泛型方法 | 特定类型约束的泛型 )
泛型作用 : 为 类 , 接口 , 方法 提供复用性 , 支持类型不确定的数据类型 ;
韩曙亮
2023/03/28
5.4K0
泛型类、泛型方法、类型通配符的使用
       你可以写一个泛型方法,该方法在调用时可以接收不同类型的参数。根据传递给泛型方法的参数类型,编译器适当地处理每一个方法调用。
泰斗贤若如
2019/06/19
3.8K0
ArrayList的toArray()方法为啥不利用泛型返回List的泛型类型的数组探究
有些同学提出“ArrayList的public T[] toArray(T[] a) 带参数的方法支持泛型可以返回参数类型的数组,public Object[] toArray()
明明如月学长
2021/08/31
1.6K0
ArrayList的toArray()方法为啥不利用泛型返回List的泛型类型的数组探究
泛型集合List<T>
?
wfaceboss
2019/04/08
6550
泛型集合List<T>
【Java 泛型】泛型简介 ( 泛型类 | 泛型方法 | 静态方法的泛型 | 泛型类与泛型方法完整示例 )
泛型 可以 简单理解为 参数化类型 , 主要作用在 类 , 方法 , 接口 上 ;
韩曙亮
2023/03/29
15.6K0
【Java 泛型】泛型简介 ( 泛型类 | 泛型方法 | 静态方法的泛型 | 泛型类与泛型方法完整示例 )
Java如何优雅获取泛型类型
在 Java 开发中,获取泛型这种操作虽不是很常用,但有时确实必须的,比如 将Json 字符串反序列化成对象的时候。今天就来介绍这个操作。
Bug开发工程师
2018/12/24
12.4K0
Java如何优雅获取泛型类型
【Java】Collection集合&泛型
👀专栏介绍 【Java】 目前主要更新Java,一起学习一起进步。 👀本期介绍 本期主要介绍Collection集合&泛型 文章目录 第一章 Collection集合 1.1 集合概述 1.2 集合框架 1.3 Collection 常用功能 第二章 Iterator迭代器 2.1 Iterator接口 2.2 迭代器的实现原理 2.3 增强for 第三章 泛型 3.1 泛型概述 3.2 使用泛型的好处 3.3 泛型的定义与使用 定义和使用含有泛型的类 含有泛型的方法 含有泛型的接口 3.4 泛型通配符
陶然同学
2023/02/27
5090
【Java】Collection集合&泛型
【Kotlin】泛型 ① ( 泛型类 | 泛型参数 | 泛型函数 | 多泛型参数 | 泛型类型约束 )
将 泛型参数 T 放在 尖括号 <T> 中 , 该泛型参数放在 类名后 , 主构造函数之前 , 该泛型参数 T 是 类型占位符 ,
韩曙亮
2023/03/30
2.9K0
Java如何优雅获取泛型类型
在 Java 开发中,获取泛型这种操作虽不是很常用,但有时确实必须的,比如 将Json 字符串反序列化成对象的时候。今天就来介绍这个操作。
好好学java
2019/05/06
6.7K0
Java如何优雅获取泛型类型
Java如何优雅获取泛型类型
在 Java 开发中,获取泛型这种操作虽不是很常用,但有时确实必须的,比如 将Json 字符串反序列化成对象的时候。今天就来介绍这个操作。
Spark学习技巧
2019/05/21
2.7K0
Java如何优雅获取泛型类型
Java进阶:【泛型】认识泛型,泛型方法,泛型类,泛型接口和通配符
例如关于这个元素如何保存,如何管理等是确定的,因此此时把元素的类型设计成一个参数,这个类型参数叫做泛型。
冷环渊
2021/11/29
3.5K0
Java进阶:【泛型】认识泛型,泛型方法,泛型类,泛型接口和通配符
【Java 泛型】泛型用法 ( 泛型类用法 | 泛型方法用法 | 泛型通配符 ? | 泛型安全检查 )
泛型类用法 : 使用时先声明泛型 , 如果不声明泛型 , 则表示该类的泛型是 Object 类型 ;
韩曙亮
2023/03/29
10.2K0
【Java 泛型】泛型用法 ( 泛型类用法 | 泛型方法用法 | 泛型通配符 ? | 泛型安全检查 )
泛型方法
上一篇章我们出于类型安全的考虑,不建议使用原生类型,用List<?>代替使用,但是List<?>不允许添加除null以外的任何元素,因此我们需要使用泛型方法List<E>,如下: import jav
java达人
2018/01/31
1.3K0
【Kotlin】泛型总结 ★ ( 泛型类 | 泛型参数 | 泛型函数 | 多泛型参数 | 泛型类型约束 | 可变参数结合泛型 | out 协变 | in 逆变 | reified 检查泛型参数类型 )
将 泛型参数 T 放在 尖括号 <T> 中 , 该泛型参数放在 类名后 , 主构造函数之前 , 该泛型参数 T 是 类型占位符 ,
韩曙亮
2023/03/30
4.1K0
【Kotlin】泛型总结 ★ ( 泛型类 | 泛型参数 | 泛型函数 | 多泛型参数 | 泛型类型约束 | 可变参数结合泛型 | out 协变 | in 逆变 | reified 检查泛型参数类型 )
泛型方法
泛型方法 http://msdn2.microsoft.com/zh-cn/library/twcad0zb.... Service Locator with Generic Methods 泛型的Foxcop设计规则 Avoid excessive parameters on generic types Collections should implement generic interface Do not declare static members on generic types Do no
张善友
2018/01/22
7170
Java泛型基础(二)泛型接口泛型方法# 总结
泛型可以应用于同一个类,该类可以针对多种类型使用,例如构建一个RedisTemplateService组件,用于处理当前应用中所有对象的缓存操作。这篇文章主要介绍泛型应用于接口、方法和匿名内部类的一些知识点和使用案例,也包括《Java编程思想》中对应的练习题的解读。
阿杜
2018/08/06
3.3K0
C# 泛型集合的自定义类型排序
int类型是实现了IComparable这个接口的。那么如果让自定义类型Person也可以排序,那么试试实现该接口;
用户7053485
2020/11/24
1.4K0
C# 泛型集合的自定义类型排序
Dart中的泛型方法、泛型类、泛型接口
为了能在一个方法里实现传入什么数据类型就返回什么数据类型,可以利用泛型将方法写成下面这样:
越陌度阡
2020/12/10
3.8K0
Dart中的泛型方法、泛型类、泛型接口
Java——泛型基本总结(通配符、泛型接口、泛型方法)
假如,现在定义一个表示坐标的类,Point,属性坐标x,y,但是此类设计特殊,现在由于设计特殊,现在实际使用中有可能出现以下三种结构的数据:
Winter_world
2020/09/25
3.4K1
Java——泛型基本总结(通配符、泛型接口、泛型方法)

相似问题

在泛型方法中返回原始集合类型

30

泛型集合和返回类型的方法

40

从泛型方法返回类型

10

从泛型类型加载泛型集合

20

泛型方法返回泛型类型

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文