Generics

2024-02-12 22:18
文章标签 generics

本文主要是介绍Generics,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

描述

泛型,也被称为类型参数,允许定义结构体或方法时,传入的参数类型不固定,运行时,可传入不同类型的参数。

定义方法

func MapKeys[K comparable, V any](m map[K]V) []K {r := make([]K, 0, len(m))for k := range m {r = append(r, k)}return r
}

该方法从任何类型的映射中取出键名。
该方法有两个类型参数:K和V,分别对应作为参数的映射的键名和键值的类型。
该方法返回一个切片,切片的类型和映射参数的键名的类型相同。

var m1 = map[int]string{1: "2", 2: "4", 4: "8"}
fmt.Println("keys m:", MapKeys(m1))
var m2 = map[string]string{"a": "2", "b": "4", "c": "8"}
fmt.Println("keys m:", MapKeys(m2))

map[1001:Aaron 1002:Ab 1003:Abbas 1004:Abbot] with keys: [1001 1002 1003 1004]
map[Aaron:doctor Ab:nurse Abbas:teacher Abbot:police] with keys: [Aaron Ab Abbas Abbot]

我们也可以明确的指定类型参数,虽然没必要。

var m = map[int]string{1001: "Aaron", 1002: "Ab", 1003: "Abbas", 1004: "Abbot"}
fmt.Println(m, "with keys:", MapKeys[int, string](m1))

map[1001:Aaron 1002:Ab 1003:Abbas 1004:Abbot] with keys: [1001 1002 1003 1004]

定义结构体

type Element[T any] struct {val  Tnext *Element[T]
}type List[T any] struct {head, tail *Element[T]
}

这是一个链表,链表里可放不同类型的元素。

func (lst *List[T]) Push(v T) {if lst.tail == nil {lst.head = &Element[T]{val: v}lst.tail = lst.head} else {lst.tail.next = &Element[T]{val: v}lst.tail = lst.tail.next}
}func (lst *List[T]) GetAll() []T {var elems []Tfor e := lst.head; e != nil; e = e.next {elems = append(elems, e.val)}return elems
}

这里定义了链表的方法,分别用于追加元素和获取所有元素。
从这里可以看出,链表的类型是List[T]。

lst := List[int]{}
lst.Push(10)
lst.Push(13)
lst.Push(23)
fmt.Println("list:", lst.GetAll())

list: [10 13 23]

这篇关于Generics的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/703746

相关文章

【Rust日报】2021-01-15 Nightly的Reference已上线Const Generics的文档

今天开始Rust日报尝试新的方式组织内容,分为如下几个板块: News:当天官方或社区有关Rust的最新新闻Article:当天社区新发布的值得阅读的Rust博客文章Release:当天社区crate或相关工具版本发布或更新Miscellaneous:其他内容 有任何问题或建议欢迎留言反馈,大家一起让Rust日报越来越好! News Nightly的Reference已上线Const Gener

在Java中实现泛型(Generics)的深入解析

在Java中,泛型(Generics)是一个强大的工具,它允许我们在编译时定义类型参数,使代码更加灵活、可重用和类型安全。下面,我将从技术难点、面试官关注点、回答吸引力以及代码举例四个方面,详细解析如何在Java中实现泛型。 一、技术难点 类型擦除:Java的泛型在运行时是通过类型擦除来实现的,这意味着在运行时,泛型类型信息会被擦除,所有的泛型类型都将被替换为它们的原始类型(如无界类型参数

解释泛型(Generics)在Java中的用途

在Java中,泛型(Generics)是一种在编译时期提供类型检查和约束的机制,它使得类和接口可以被参数化,即你可以定义一个类或接口,并通过参数传入具体的类型。泛型增加了代码的复用性和类型安全性,同时减少了代码中强制类型转换的需求。 泛型的主要用途: 类型安全:泛型提供了编译时类型检查,确保代码中使用的类型是预期的,有助于防止运行时类型错误。 消除类型强制转换:在使用泛型之前,从集合中获取

ava中的泛型(Generics)它们的优势是什么和例子

Java中的泛型(Generics)是一种强大的编程工具,它允许程序员在定义类、接口和方法时使用类型参数,从而创建可重用的组件,这些组件可以工作于多种数据类型。泛型的主要优势包括: 类型安全:使用泛型可以在编译时捕获类型错误,避免在运行时出现类型转换异常。通过在编译时强制执行类型检查,可以减少因类型不匹配而导致的运行时错误。 代码重用:泛型使得可以编写通用的代码,这些代码可以适用于不同的数据类

java 泛型(generics)介绍

一、泛型简单介绍 class Box { private String t; private Integer a; public Box(String t,Integer a){this.t=t;this.a=a;} }常规的类的声明如上,每个属性的类型都是确定的,如果需要更改属性类型,就需要重新声明另一个类,这无疑是麻烦的,能否做到只声明一个类,但是这个类中的属性的类型可以包含所有的类

springboot整合tk-mybatis时报错:sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to

出现这种错误是因为配置扫描mapper的时候扫描到了BaseMapper,把它从指定的扫描路径中迁移出去就行了,框架类的文件单独建一个路径: 总之就是要扫描mapper的时候只扫描业务mapper,不要扫描到BaseMapper.

sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class

主要代码:         private Class<T> beanClass;@SuppressWarnings("unchecked")public BaseDaoImpl() {ParameterizedType parameterizedType=(ParameterizedType)this.getClass().getGenericSuperclass();beanClass=(C

【.NET Core】泛型(Generics)详解

【.NET Core】泛型(Generics)详解 文章目录 【.NET Core】泛型(Generics)详解一、概述二、泛型类型参数三、泛型中类型参数的约束3.1 where T:struct3.2 where T:class3.3 where T:class?3.4 where T:notnull3.5 where T:default3.6 where T:unmanaged3.7

20:kotlin 类和对象 --泛型(Generics)

类可以有类型参数 class Box<T>(t: T) {var value = t} 要创建类实例,需提供类型参数 val box: Box<Int> = Box<Int>(1) 如果类型可以被推断出来,可以省略 val box = Box(1) 通配符 在JAVA泛型中有通配符?、? extends E、? super E,在kotlin中没有这个概念,取而代之的是Dec

8.泛型(generics)

//泛型function echo<T>(arg: T): T {return arg}const result = echo(true)function swap<T, U>(tuple: [T, U]): [U, T] {return [tuple[1], tuple[0]]}const result2 = swap(['string', 123])//约束泛型interface