不知道大家对于java泛型是怎么理解的?
大家认为泛型到底有什么作用了?
泛型只能存放指定类型的数据,底层对此进行了处理,我们只能对存取指定类型的数据
很多人一定是这么理解的吧,但实际上并不是哦,泛型只是为了规范在编译的时候对泛型做了判断,为了方便我们存取,减少编程错误,其实底层编译成字节码的时候并没有任何泛型,和jdk1.5之前其实是没区别的,如果我们绕开编译,那完全可以存放其他类型的数据
如何绕开,我们可以利用反射,大家看看下面的代码
package a; import java.util.ArrayList; import java.util.List; public class A { public A(String s) { slist.add(s); } private List<String> slist = new ArrayList<>(); public List<String> getSlist() { return slist; } public void setSlist(List<String> slist) { this.slist = slist; } }
首先我们定义了这么一个类,里面有一个带着泛型的list
然后
package a; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.util.List; public class B { public static void main(String[] args) throws Exception { A a1 = new A("测试数据"); Class clazz =Class.forName("a.A"); Method m =clazz.getMethod("getSlist", null); List la = (List) m.invoke(a1, null); la.add(new ben()); List la1=(List) m.invoke(a1, null); System.out.println(la1); } } class ben{ int i=1; String s="4"; @Override public String toString() { return "ben [i=" + i + ", s=" + s + "]"; } }
大家觉得最后打印的结果是什么呢
[测试数据, ben [i=1, s=4]]
结果是这样的,你没看错,我在泛型为String的集合里面放了一个自定义的类,如果泛型的编译的时候真的做了处理,那么在la.add(new ben());这一句的时候应该抛出类型转换异常
怎么样,是不是大吃一惊,发现和自己知道的完全不一样?(大神请无视)
相关推荐
这意味着在编译完成后,所有的泛型信息都会被擦除,替换为Object或者其他基础类型。因此,泛型在运行时并不存在,所有关于泛型的操作都在编译期间完成。 2. **边界通配符**:在处理泛型时,我们经常遇到边界通配符...
此外,泛型还支持接口,如IEnumerable、IList等,这使得泛型类可以方便地与其他泛型类或非泛型类进行交互。通过这种方式,你可以构建高度可复用和灵活的代码库。 总结来说,VS2008中的泛型特性增强了.NET开发的类型...
- **类型安全性**:泛型确保了只有正确的类型才能被放入集合中。 - **性能提升**:避免了运行时类型转换带来的开销,如装箱和拆箱操作。 - **代码复用**:可以通过指定不同的类型参数来创建具有相同行为但处理不同...
例如,我们可以定义一个泛型接口`MyInterface<T>`,并让其他类实现这个接口,从而强制实现类遵循特定的类型约束。 泛型还有其他一些高级用法,如通配符(Wildcards),如`<?>`,它可以表示任何类型,但通常用于限制...
当我们尝试将不兼容的类型放入泛型集合时,编译器会立即发出警告。 2. 性能提升:由于泛型集合不需要在运行时进行类型检查和转换,因此在处理大量数据时,它们通常比非泛型集合更快。 3. 易于使用:泛型集合提供了...
这意味着你可以将任何类型的对象放入这些集合中,这种灵活性虽然方便但也带来了一些问题: - **类型安全问题**:由于缺乏类型约束,很容易在运行时遇到类型转换错误。 - **性能损失**:非泛型集合需要频繁地进行...
当`List`中的元素是泛型类型时,我们可能需要根据这些泛型对象的某个属性来对列表进行排序。这就是“LIST泛型排序”所涉及的主题。在本篇文章中,我们将深入探讨如何实现这个功能,并通过一个具体的示例来阐述。 ...
在使用泛型时,编译器会检查类型是否匹配,确保只有兼容的类型才能被使用。例如,尝试将一个字符串放入一个定义为整数的List中,编译器会在编译时报错,避免了运行时可能出现的异常。 9.1.3 二进制代码重用和代码的...
泛型是.NET框架中的一项重要特性,它允许开发者创建可重用的类型,这些类型可以在多种数据类型上工作,而无需为每种类型创建单独的实现。在C#中,泛型显著提高了代码的灵活性和效率,尤其是在处理集合和算法时。 ...
这意味着我们可以将`Circle`、`Rectangle`等`Shape`的子类对象放入列表,但不能放入非`Shape`类型的对象。 5. **泛型的类型擦除** Java泛型在编译期间执行类型检查,但在运行时,泛型信息会被擦除,这意味着所有...
### C# 泛型简介 #### 一、什么是泛型? 在C#中,泛型是一种类型参数化机制,允许开发者...泛型不仅可以应用于类和接口,还可以用于方法和委托等其他语言结构。掌握泛型的使用是成为一名高级C#开发者的必备技能之一。
例如,在 `Box<T>` 类中,`T` 可以被替换为 `Integer`、`String` 或其他任何 Java 类型。 #### 三、类型擦除 Java 泛型是在编译阶段进行类型检查的,但编译后的字节码并不包含泛型信息。这意味着所有的泛型类型...
使用泛型还有其他好处,如编译时的类型检查,防止了类型转换异常。当尝试将错误类型的对象放入或取出栈时,编译器会报错,而不是等到运行时才出现异常。此外,泛型也提高了代码的可读性,因为类型信息更加明确。 在...
这意味着无法直接检查一个对象是否为特定泛型类型的实例。 #### 数组与泛型 Java中的数组类型并不遵循与泛型相同的规则。创建一个泛型类型的数组会引发编译错误,因为这会导致类型擦除后出现类型安全问题。 #### ...
在Java 5之后引入的泛型(Generics)让集合的类型安全得以提升。`<E>`代表了元素类型,确保集合只能存储特定类型的对象。例如,如果你声明了一个`ArrayList<String>`,那么这个列表只能添加字符串,否则编译器会报错...
在C#中,`System.Collections.Generic` 命名空间提供了 `Dictionary, TValue>` 类,这使得我们可以用任意类型的键和值来创建自定义的字典。 ### 1. 创建及初始化 创建一个新的Dictionary实例非常简单,只需指定键和...
可以限定集合中的元素类型,保证集合中的元素是按照要求放入的。 可以增强多态(继承多个接口而无需写继承类)。 保证参数有效。 泛型的局限性: 不能实例化泛型 T t = new T(); //error ...
- **类型安全性**:泛型确保只有正确类型的对象才能被放入容器中,从而避免运行时错误。 - **性能**:由于避免了类型转换(如装箱和拆箱),泛型通常比非泛型实现更快。 - **代码重用**:通过泛型,可以编写一次逻辑...
由于HashTable是非泛型的,因此键和值可以是任何类型,但这也意味着可能需要进行类型检查。 3. DictionaryBase和Dictionary, TValue>:DictionaryBase是一个抽象基类,提供了基本的字典功能。而Dictionary, TValue>...
`List<T>`是C#中的泛型集合,可以存储任意类型的对象,非常适合用来管理一组图片的路径或对象。 3. 自动播放:自动播放功能通常依赖于定时器组件。C#中的`System.Windows.Forms.Timer`类提供了间隔触发事件的能力。...