`
神绮_H_亚里亚
  • 浏览: 10513 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

泛型是否可以放其他类型

阅读更多

不知道大家对于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());这一句的时候应该抛出类型转换异常

怎么样,是不是大吃一惊,发现和自己知道的完全不一样?(大神请无视)

 

 

0
1
分享到:
评论

相关推荐

    java泛型的内部原理及更深应用

    这意味着在编译完成后,所有的泛型信息都会被擦除,替换为Object或者其他基础类型。因此,泛型在运行时并不存在,所有关于泛型的操作都在编译期间完成。 2. **边界通配符**:在处理泛型时,我们经常遇到边界通配符...

    vs2008 泛型 的使用 实例

    此外,泛型还支持接口,如IEnumerable、IList等,这使得泛型类可以方便地与其他泛型类或非泛型类进行交互。通过这种方式,你可以构建高度可复用和灵活的代码库。 总结来说,VS2008中的泛型特性增强了.NET开发的类型...

    深入浅出.NET泛型编程

    - **类型安全性**:泛型确保了只有正确的类型才能被放入集合中。 - **性能提升**:避免了运行时类型转换带来的开销,如装箱和拆箱操作。 - **代码复用**:可以通过指定不同的类型参数来创建具有相同行为但处理不同...

    JAVA泛型详解[参考].pdf

    例如,我们可以定义一个泛型接口`MyInterface&lt;T&gt;`,并让其他类实现这个接口,从而强制实现类遵循特定的类型约束。 泛型还有其他一些高级用法,如通配符(Wildcards),如`&lt;?&gt;`,它可以表示任何类型,但通常用于限制...

    泛型集合(动态添加按纽)

    当我们尝试将不兼容的类型放入泛型集合时,编译器会立即发出警告。 2. 性能提升:由于泛型集合不需要在运行时进行类型检查和转换,因此在处理大量数据时,它们通常比非泛型集合更快。 3. 易于使用:泛型集合提供了...

    NET 2.0 泛型编程

    这意味着你可以将任何类型的对象放入这些集合中,这种灵活性虽然方便但也带来了一些问题: - **类型安全问题**:由于缺乏类型约束,很容易在运行时遇到类型转换错误。 - **性能损失**:非泛型集合需要频繁地进行...

    LIST泛型排序

    当`List`中的元素是泛型类型时,我们可能需要根据这些泛型对象的某个属性来对列表进行排序。这就是“LIST泛型排序”所涉及的主题。在本篇文章中,我们将深入探讨如何实现这个功能,并通过一个具体的示例来阐述。 ...

    C#泛型详解。doc

    在使用泛型时,编译器会检查类型是否匹配,确保只有兼容的类型才能被使用。例如,尝试将一个字符串放入一个定义为整数的List中,编译器会在编译时报错,避免了运行时可能出现的异常。 9.1.3 二进制代码重用和代码的...

    张子阳《.NET之美》样章 - 理解泛型

    泛型是.NET框架中的一项重要特性,它允许开发者创建可重用的类型,这些类型可以在多种数据类型上工作,而无需为每种类型创建单独的实现。在C#中,泛型显著提高了代码的灵活性和效率,尤其是在处理集合和算法时。 ...

    推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 09.泛型(共15页).ppt

    这意味着我们可以将`Circle`、`Rectangle`等`Shape`的子类对象放入列表,但不能放入非`Shape`类型的对象。 5. **泛型的类型擦除** Java泛型在编译期间执行类型检查,但在运行时,泛型信息会被擦除,这意味着所有...

    C# 泛型简介

    ### C# 泛型简介 #### 一、什么是泛型? 在C#中,泛型是一种类型参数化机制,允许开发者...泛型不仅可以应用于类和接口,还可以用于方法和委托等其他语言结构。掌握泛型的使用是成为一名高级C#开发者的必备技能之一。

    Java的泛型是什么?怎么用.pdf

    例如,在 `Box&lt;T&gt;` 类中,`T` 可以被替换为 `Integer`、`String` 或其他任何 Java 类型。 #### 三、类型擦除 Java 泛型是在编译阶段进行类型检查的,但编译后的字节码并不包含泛型信息。这意味着所有的泛型类型...

    Java语言程序设计:第七章 泛型.ppt

    使用泛型还有其他好处,如编译时的类型检查,防止了类型转换异常。当尝试将错误类型的对象放入或取出栈时,编译器会报错,而不是等到运行时才出现异常。此外,泛型也提高了代码的可读性,因为类型信息更加明确。 在...

    Java Generics Tutorial

    这意味着无法直接检查一个对象是否为特定泛型类型的实例。 #### 数组与泛型 Java中的数组类型并不遵循与泛型相同的规则。创建一个泛型类型的数组会引发编译错误,因为这会导致类型擦除后出现类型安全问题。 #### ...

    java集合与泛型[参考].pdf

    在Java 5之后引入的泛型(Generics)让集合的类型安全得以提升。`&lt;E&gt;`代表了元素类型,确保集合只能存储特定类型的对象。例如,如果你声明了一个`ArrayList&lt;String&gt;`,那么这个列表只能添加字符串,否则编译器会报错...

    C#中Dictionary泛型集合7种常见的用法

    在C#中,`System.Collections.Generic` 命名空间提供了 `Dictionary, TValue&gt;` 类,这使得我们可以用任意类型的键和值来创建自定义的字典。 ### 1. 创建及初始化 创建一个新的Dictionary实例非常简单,只需指定键和...

    \java超强笔记(超级经典)

    可以限定集合中的元素类型,保证集合中的元素是按照要求放入的。 可以增强多态(继承多个接口而无需写继承类)。 保证参数有效。 泛型的局限性: 不能实例化泛型 T t = new T(); //error ...

    C# Language Specification(规范)

    - **类型安全性**:泛型确保只有正确类型的对象才能被放入容器中,从而避免运行时错误。 - **性能**:由于避免了类型转换(如装箱和拆箱),泛型通常比非泛型实现更快。 - **代码重用**:通过泛型,可以编写一次逻辑...

    ASP.NET中的集合对象

    由于HashTable是非泛型的,因此键和值可以是任何类型,但这也意味着可能需要进行类型检查。 3. DictionaryBase和Dictionary, TValue&gt;:DictionaryBase是一个抽象基类,提供了基本的字典功能。而Dictionary, TValue&gt;...

    C#图片自动播放浏览器

    `List&lt;T&gt;`是C#中的泛型集合,可以存储任意类型的对象,非常适合用来管理一组图片的路径或对象。 3. 自动播放:自动播放功能通常依赖于定时器组件。C#中的`System.Windows.Forms.Timer`类提供了间隔触发事件的能力。...

Global site tag (gtag.js) - Google Analytics