震撼揭秘Java泛型:T、E、K、V与通配符?的终极奥义大公开!

「 Java基础-泛型 」一文说清Java泛型中的通配符T、E、K、V、N、?和Object的区别和含义 当我们在阅读源码的时候通常会看到如下所示代码中存在“E”、“T”或“?”,那么,这些大写字母到底有着怎样的含义呢?接下来我们具体讨论一下。/**/**Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 阅读详情

引言:

1、为什么需要Java泛型?

Java泛型(Generics`)于Java 5引入,解决了早期集合框架中类型不安全和强制转换的问题。通过类型参数,泛型泛型在编译时确保类型安全,减少运行时异常,同时提升代码可读性和复用性。例如:

// 无泛型时代
List list = new ArrayList();
list.add("Hello");
list.add(123); // 类型不安全
String str = (String) list.get(0); // 需要强制转换

// 泛型时代
List<String> list = new ArrayList<>();
list.add("Hello");
// list.add(123); // 编译错误,类型安全
String str = list.get(0); // 无需转换

本文将聚焦泛型的核心——类型参数(T、E、K、V)与通配符(?),通过图表、示例和实战,全面解析其机制与应用。

2、泛型基础:核心概念与历史

2.1 泛型概述

泛型允许在定义类、接口或方法时使用类型参数,延迟类型指定到实例化或调用时。核心优势包括:

  • 类型安全:编译时检查类型错误。
  • 代码复用:同一代码适配多种类型。
  • 消除强制转换:简化代码。
class Pair<K, V> {
    private K key;
    private V value;
    public Pair(K key, V value) {
        this.key = key;
        this.value = value;
    }
}
Pair<String, Integer> pair = new Pair<>("age", 25);

2.2 类型擦除的原理

Java泛型采用类型擦除机制,编译后泛型信息被擦除,运行时仅保留原始类型(如List变为List)。这确保了向后兼容,但也带来限制:

  • 无法在运行时获取泛型类型。

  • 不能创建泛型数组(如new T[])。
    范型类型擦除

3、类型参数:T、E、K、V的命名与应用

类型参数是泛型的基础,用于占位具体类型。以下是常见命名约定:

3.1 T:通用类型参数

  • 定义:T(Type)表示任意类型,适用于泛型类或方法。
class Box<T> {
    private T value;
    public void setValue(T value) { this.value = value; }
    public T getValue() { return value; }
}
Box<String> strBox = new Box<>();
strBox.setValue("Hello");
Box<Integer> intBox = new Box<>();
intBox.setValue(123);
  • 用途:定义通用容器或算法。

3.2 E:集合元素类型

  • 定义:E(Element)表示集合元素类型,常见于List、Set。

示例:

public class MyList<E> {
    private List<E> elements = new ArrayList<>();
    public void add(E element) { elements.add(element); }
    public E get(int index) { return elements.get(index); }
}
MyList<String> list = new MyList<>();
list.add("Element");
  • 用途:集合框架,清晰表达元素语义。

3.3 K 与 V:键值对类型

  • 定义:K(Key)表示键,V(Value)表示值,常见于Map<K, V>。

  • 示例:

public class Cache<K, V> {
    private Map<K, V> map = new HashMap<>();
    public void put(K key, V value) { map.put(key, value); }
    public V get(K key) { return map.get(key); }
}
Cache<String, Integer> cache = new Cache<>();
cache.put("score", 100);
  • 用途:映射类,增强语义化。

3.4 其他参数命名约定(如U、S)

U、S:当需要多个类型参数时,常用U、S作为补充。

public <T, U> void process(T t, U u) {
    System.out.println(t + ", " + u);
}
  • 自定义命名:复杂场景下可使用语义化命名,如R(Result)。

  • 约定:单字母大写,简洁且易读。

4、通配符:? 的灵活性与限制

  • 通配符(?)用于表示未知类型,增强方法灵活性,分为三种形式:

4.1 无界通配符:?

定义:表示任意类型,适用于不需知道具体类型的场景。

限制:

  • 只读:读取返回Object。

  • 不可写:因类型未知,写入不安全。

示例:

public void printList(List<?> list) {
    for (Object item : list) {
        System.out.println(item);
    }
}
List<String> strList = Arrays.asList("A", "B");
List<Integer> intList = Arrays.asList(1, 2);
printList(strList); // 输出: A, B
printList(intList); // 输出: 1, 2

无界通配符适用场景示意图

在这里插入图片描述

4.2 上界通配符:? extends T

  • 定义:表示T或其子类,限制类型上界。

  • 用途:只读场景,从对象获取数据(生产者)。

  • 限制:不能写入,因具体子类未知。

  • 示例:

public double sum(List<? extends Number> list) {
    double total = 0;
    for (Number num : list) {
        total += num.doubleValue();
    }
    return total;
}
List<Integer> intList = Arrays.asList(1, 2, 3);
List<Double> doubleList = Arrays.asList(1.1, 2.2);
System.out.println(sum(intList)); // 输出: 6.0
System.out.println(sum(doubleList)); // 输出: 3.3

4.3 下界通配符:? super T

  • 定义:表示T或其超类,限制类型下界。

  • 用途:只写场景,向对象写入数据(消费者)。

  • 限制:读取返回Object,因类型可能是T或超类。

  • 示例:

public void addIntegers(List<? super Integer> list) {
    list.add(1);
    list.add(2);
}
List<Number> numList = new ArrayList<>();
List<Object> objList = new ArrayList<>();
addIntegers(numList);
addIntegers(objList);
System.out.println(numList); // 输出: [1, 2]

上下界通配符对比图

5、 PECS 原则:生产者与消费者者

PECS(Producer Extends, Consumer Super)指导通配符使用:

  • Producer Extends:? extends T用于读取数据。
  • Consumer Super:? super T用于写入数据。
    示例:
public static <T> void copy(List<? super T> dest, List<? extends T> src) {
    for (T item : src) {
        dest.add(item);
    }
}
List<Number> numbers = new ArrayList<>();
List<Integer> integers = Arrays.asList(1, 2, 3);
copy(numbers, integers);
System.out.println(numbers); // 输出: [1, 2, 3]

PECS 原则流程图

6、高级泛型泛型:复杂场景与多界限

6.1 嵌套泛型

泛型可嵌套,常见于复杂数据结构:

List<Map<String, List<Integer>>> data = new ArrayList<>();
Map<String, List<Integer>> map = new HashMap<>();
map.put("scores", Arrays.asList(90, 95));
data.add(map);

6.2 多重界限的使用

类型参数可指定多个上界,使用&连接:

public <T extends Number & Comparable<T>> T max(T a, T b) {
    return a.compareTo(b) > 0 ? a : b;
}
System.out.println(max(10, 5)); // 输出: 10
  • 限制:通配符不支持多重界限。

6.3 泛型与反射结合

由于类型擦除,运行时需通过反射获取类型信息:

public class TypeInfo<T> {
    private Class<T> type;
    @SuppressWarnings("unchecked")
    public TypeInfo() {
        type = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    }
}
class StringType extends TypeInfo<String> {}
System.out.println(new StringType().type); // 输出: class java.lang.String

7、常见误区与最佳实践 (#常见问题误区与最佳实践)

7.1 误区分析

  • 误用原始类型:
List list = new ArrayList(); // 可能导致类型不安全
  • 忽略通配符限制:
List<? extends Number> list = new ArrayList<Integer>();
// list.add(1); // 编译错误
  • 泛型数组问题:
// T[] array = new T[10]; // 编译错误
T[] array = (T[]) new Object[10]; // 解决方法

7.2 最佳实践建议

  • 使用具体泛型类型,避免原始类型。

  • 根据PECS选择通配符。

  • 为复杂泛型添加注释,提升可读性。

  • 使用@SuppressWarnings("unchecked")处理不可避免的警告。

8、实战案例:泛型在框架设计中的应用

以简化的DAO框架为例,展示泛型在实际项目中的应用:

public interface Repository<T, ID> {
    T findById(ID id);
    void save(T entity);
}
public class UserRepository implements Repository<User, Long> {
    @Override
    public User findById(Long id) {
        return new User(id, "User" + id);
    }
    @Override
    public void save(User entity) {
        System.out.println("Saved: " + entity);
    }
}
UserRepository repo = new UserRepository();
User user = repo.findById(1L);
repo.save(user);

框架设计中的泛型结构图

9、总结与展望

Java泛型通过类型参数(T、E、K、V)和通配符(?、? extends T、? super T)实现类型安全与灵活性。掌握PECS原则、多重界限和实战技巧,开发者可应对复杂场景。未来,Java可能进一步优化泛型(如值类型支持),值得关注。

一看就懂 详解JAVA泛型通配符T,E,K,V区别 泛型从字面上理解,是指一个类、接口或方法支持多种类型,使之广泛化、一般化和更加通用。通配符只有在修饰一个变量时会用到,使用它可方便地引用包含了多种类型的泛型;下面我们来深入了解一下吧 立即下载

相关推荐

LSF实践专题(15):LSF队列优先级以及抢占功能初探

在LSF暂停作业时,会向作业发送一个SIGTSTP信号,并且将作业状态变成SSUSP(system suspend),表示被系统暂停,这时,最好是作业的应用能够捕获和处理SIGTSTP信号,否则,即使在LSF中,作业会被认为暂停了,并且释放了slots资源,但是在实际OS中,作业进程仍然在继续,并且不会释放CPU等计算资源。是指LSF自动将低优先级作业暂停(suspend),将空余出来的资源交给高优先级队列中的作业使用,等到高优先级队列的作业结束后,再将被暂停的作业恢复(resume)并继续运行。

richycn的博客 1919

泛型中的 T、E、K、V代表的意义

泛型中的 T、E、K、V代表的意义

m0_47743175的博客 1028

​开源大模型实战:GLM-4.1V-Thinking本地部署教程(附API调用代码)

​在AI应用从“能用”向“好用”进阶的当下,​的需求愈发强烈:企业需保障数据安全(如医疗影像、金融报告不外传),开发者追求定制化能力(如微调模型适配垂直场景),科研团队则依赖离线环境处理敏感数据。智谱AI开源的​(10B级参数,支持图像、视频、文档多模态推理)凭借的优势,成为本地部署的热门选择。不过,对于“不想折腾技术”的普通用户或快速验证需求的团队而言,​,无需安装配置,打开即用,堪称“零门槛”体验的捷径。本文将分为两部分:先手把手教你​(适合有技术背景的用户),再对比介绍。

gogoMark的博客 1341

泛型中K T V E ? Object等分别代表什么含义?

在泛型中,K、T、V、E等字母是类型参数的约定名称,它们用于表示待确定的类型。在类型擦除时,如果泛型类型参数没有限定类型,那么类型参数会被替换为Object类型。用于表示一个未知类型,通常在使用泛型方法时,为了表示类型范围限制而使用。Pair<T, U>:一个泛型对,其中T表示第一个元素的类型,U表示第二个元素的类型。泛型编程中最常用的类型参数,表示待确定的一个通用类型。Map<K, V>:一个泛型映射,其中K表示键的类型,V表示值的类型。List<T>:一个泛型列表,其中T表示列表中元素的类型。

weixin_72084017的博客 604

反无人机技术实战解析:从探测到拦截的全方位防御策略

本文深入解析了反无人机(C-UAS)技术的全链条防御策略。从雷达、无线电频谱、光电等多维度探测技术,到数据融合与威胁评估,再到无线电干扰、导航诱骗及物理拦截等核心拦截手段,系统阐述了如何构建从探测到拦截的实战化防御体系,为关键设施、大型活动等场景提供定制化空域安全解决方案。

weixin_29230649的博客 403

张量分解浅谈(四 Tucker 分解)

学完了SVD算法之后,我们继续回到张量几大分解的学习上来,本期学习的主要内容是张量的 Tucker 分解 以及 前面的CP分解还留下一点没有说完,正好一并补齐!后面的公式我将采用颜色标记,红色代表必须掌握,蓝色尽量掌握! 在这之前先附一张图,包含了各种运算符号的名称含义,大部分是前面说过或者使用过的: Tensor decomposition一 . Tucker 分解公式介绍和原理二 . 张量的 n-Rank 一 . Tucker 分解公式介绍和原理 我们先来看一张被使用过很多次的Trucker 分解图

欢迎来到 豪哥 的博客 1万+

Java泛型--Java中的E、T、?

我看到集合中放进去了一个Integer类型的数据,但我get(index)拿到的是Object类型,必须向下转型为Integer。Object类型可以接收任意类型,但实际应用中会有类型转换的问题。T只能用extends来限定缩小范围,而?,也就是上面总结的。泛型方法,即调用时才指明泛型的具体类型。和 T,声明了T类型以后,T可以操作,而?引入泛型,即为集合中的元素指定一个统一的类型。实例化后,恢复成只能add类A和其子类。实例化时的类只能是类型A及其父类型。后面有内容再补吧,?

llg___的博客 6086

Ubuntu22.04中通过conda快速部署PyTorch开发环境(CPU/GPU双版本实战)

本文详细介绍了在Ubuntu22.04系统中,如何利用Conda高效部署PyTorch开发环境。文章分别提供了CPU与GPU双版本的实战教程,涵盖环境创建、镜像加速、版本匹配及深度验证等关键步骤,旨在帮助开发者快速搭建稳定、兼容的深度学习环境,从而专注于模型开发。

rose2的博客 558

泛型中的 T、E、K、V、?等等,究竟是啥?

大家好,我是宝哥!前言泛型带来的好处泛型中通配符常用的 T,E,K,V,??无界通配符上界通配符 < ? extends E>下界通配符 < ? super E>?和 T 的区别Class<T>和Class<?>区别小结前言Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测...

程序员闪充宝 496

Abel逆变换及其求解方法

Abel逆变换常应用在轴对称的、光学薄的火焰、羽流或等离子体重建。

weixin_49783507的博客 8375

雷电模拟器+Google Play服务配置全指南:从安装到定位问题解决

本文详细介绍了雷电模拟器配置Google Play服务的全流程,包括版本选择、组件安装、定位服务调试及网络问题排查。针对安卓开发者的常见挑战,提供从基础到高级的解决方案,帮助优化测试环境稳定性与定位精度。

weixin_30399821的博客 1242

Java泛型中K、T、V、E、?等的含义

在定义泛型类、接口和方法时,都会定义一个参数类型,我们用过、、等,那么这些字母有什么区别和不同呢?定义Java的泛型时,通常使用的一些类型参数的字母或者符号有:E、T、K、V、N、?Object等。首先,E、T、K、V、N等这些字母之间没什么区别,使用T的地方完全可以换成U、S、Z等任意字母。当然,一般我们会使用一些常用的字母,这些字符一般是一些类型的缩写。以上这些类型其实都是确定的类型,如List表示List中的类型只能是T。除此之外,还有不确定的类型,那就是。

Blue_Pepsi_Cola的博客 1万+

MATLAB基础应用精讲-【强化学习】Actor - Critic 算法(附python代码实现)

这种架构结合了策略梯度方法(Policy - Gradient Methods)和价值函数估计方法(Value Function Estimation Methods)的优点。在强化学习中,智能体(Agent)需要通过与环境(Environment)的交互来学习最优的行为策略,以获得最大的累积奖励(Cumulative Reward)。

qq_36130719的博客 363

【笔记】Java核心技术卷1-第八章_泛型程序设计

8.1.1 类型参数的好处 ArrayList 类有一个类型参数用来指示元素的类型:ArrayList<String> files = new ArrayList<String>(); 这使得代码具有更好的可读性。人们一看就知道这个数组列表中包含的是 String 对象。 在不用类型参数时,在调用get时不需要进行强制转换。在add时,编译器进行检查是否为String(原来Object可添加任意对象)。 8.2 定义简单泛型类 public class PairTest1 {

Ethan_997的博客 416

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

在Java泛型中,T、E、K、V、?等字母都是泛型的类型

需要注意的是,这些字母只是泛型类型参数的一种命名方式,其实际含义并不限于上述解释,而是取决于具体的代码实现。在实际编程中,可以根据需要自定义泛型类型参数的名称。在Java泛型中,T、E、K、V、?K:表示Map中键的类型,常用于泛型类或泛型方法中。V:表示Map中值的类型,常用于泛型类或泛型方法中。E:表示集合元素的类型,常用于泛型类或泛型方法中。T:表示一般的类型,常用于泛型类或泛型方法中。: 通配符,表示任意类型,常用于泛型方法中。

FourAu的博客 1282

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

聊一聊Java 泛型中的通配符 T,E,K,V,?

前言 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型。 泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。 泛型带来的好处 在没有泛型的情况的下,通过对类型 Object 的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开...

weixin_30474613的博客 4314

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

泛型及当中的T、E、?分别代表什么意思

一、泛型 泛型是jdk1.5之后的新特性,最大的好处是使用集合的时候更加安全,泛型指定了类型之后,在编译器就能知道是否插入了错误的对象。取出的时候也能够安全取出,不需要做类型转换。 List<String> list = new ArrayList<String>(); 使用了List<T>指定了 容器中只能允许添加String类型的对象,如果你添加了一个In...

莫失莫忘的博客 9168

Java 泛型中的 ? T K V E等代表的意思

 Java泛型中的标记符含义:  E - Element (在集合中使用,因为集合中存放的是元素)  T - Type(Java 类) T代表在调用时的指定类型 K - Key(键) V - Value(值) N - Number(数值类型)? -  表示不确定的java类型  一般用在通配 定义泛型:Point&lt;T&gt;首先,大家可以看到Point&lt;T&gt;在类名后面加一个尖括号...

jcpp9527的博客 2996

三分钟学习Java泛型中T、E、K、V、?的含义

点击上方☝Java编程技术乐园,轻松关注!及时获取有趣有料的技术文章做一个积极的人编码、改bug、提升自己我有一个乐园,面向编程,春暖花开!泛型是Java中一个非常重要的内容,对于Jav...

阿飞云漫步 1万+

一个例子全部说明java泛型中的K,V,T,E,?,object的意思及其用法

1.意思    jdk中的K,V,T,E等泛型名称很多人以为是固定写法,其实这些名称是可以改的,比如改成zhangsan,lisi都可以,jdk为了容易看懂,所以用K表示键,V表示值,T表示type类型,E表示enum枚举,其实这四个都只是符号,都是表示泛型名称,下面的例子的T全部可以换成E,也可以换成K,V,zhangsan,都没关系。    ? 表示不确定的类型    Object java...

Mars Suburbs People 1236

Java泛型T E K V ? 详解

  JAVA泛型通配符T,E,K,V区别,T以及Class&lt;T&gt;,Class&lt;?&gt;的区别   1. 先解释下泛型概念 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。Java语言引入泛型的好处是安全简单。在Java SE ...

qq_27304089的博客 2424

Java - 泛型

泛型

qq_35221384的博客 334

java基础之泛型T,E,K,V

前言 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型。 泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。 泛型的好处: ...

qq_41720578的博客 2138

JAVA泛型通配符T,E,K,V区别,T以及Class<T>,Class<?>的区别

先"先感谢"和转载于https://www.jianshu.com/p/95f349258afb1. 先解释下泛型概念 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。Java语言引入泛型的好处是安全简单。 在Java SE 1.5之前,没有泛型的情况的下,通

qq_31433709的博客 1万+

Java泛型中E、T、K、V等的含义

Java泛型中的标记符含义:   E - Element (在集合中使用,因为集合中存放的是元素)  T - Type(Java 类)  K - Key(键)  V - Value(值)  N - Number(数值类型) ? -  表示不确定的java类型  S、U、V  - 2nd、3rd、4th types Obje

不懂不懂 8269
上一篇: 哈希表逆天神技!手写 CustomHashMap + JDK 源码解析,面试官当场傻眼!
下一篇: 动态扩容神技!手写 Redis 渐进式 rehash,面试官直接跪拜!
wáng bēn
博客等级 码龄7年 97粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wáng bēn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值