首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java泛型类型绑定.为什么不编译?

Java泛型类型绑定是一种在编译时期进行类型检查和类型安全的机制。它允许我们在定义类、接口或方法时使用参数化类型,以便在使用时指定具体的类型。

在Java中,泛型类型绑定使用尖括号<>来指定类型参数。例如,我们可以定义一个泛型类如下:

代码语言:java
复制
public class MyGenericClass<T> {
    private T value;

    public void setValue(T value) {
        this.value = value;
    }

    public T getValue() {
        return value;
    }
}

在这个例子中,T是一个类型参数,它可以在使用时指定具体的类型。例如,我们可以创建一个MyGenericClass的实例,并指定TString类型:

代码语言:java
复制
MyGenericClass<String> myGeneric = new MyGenericClass<>();
myGeneric.setValue("Hello");
String value = myGeneric.getValue();

这样,编译器会在编译时期进行类型检查,确保我们只能使用String类型的值。

然而,有时候我们可能想要对泛型类型进行更加具体的限制,而不仅仅是使用任意类型。这时,我们可以使用类型通配符来进行类型绑定。类型通配符使用?表示,它表示未知类型。例如,我们可以定义一个方法来打印任意类型的数组:

代码语言:java
复制
public static void printArray(List<?> list) {
    for (Object element : list) {
        System.out.println(element);
    }
}

在这个例子中,List<?>表示一个未知类型的List,我们可以传入任意类型的List作为参数。

为什么泛型类型绑定不编译?这是因为泛型类型擦除。在Java中,泛型类型信息只存在于编译时期,在运行时期会被擦除。这意味着在运行时期,我们无法获得泛型类型的具体信息。因此,编译器会在编译时期进行类型检查,但在运行时期,泛型类型信息会被擦除,所以无法进行类型检查。

虽然泛型类型绑定不编译,但它仍然可以在编译时期提供类型安全和类型检查的好处。通过使用泛型类型绑定,我们可以在编译时期捕获一些类型错误,并提供更好的代码可读性和可维护性。

腾讯云相关产品和产品介绍链接地址:

请注意,以上链接仅为示例,具体产品和服务选择应根据实际需求进行评估和选择。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

灵魂拷问Java,extends你为什么继承

问题 今天在知乎上遇到这么个问题,方法apply定义了T和S,S extends T,按理说S只能是T的本身及其子类型,但实际中,参数s传入任何类型都能正常运行。...类型擦除 据说在很久很久以前,JAVA混沌未开,jdk1.5这个老大哥还没有拥有,后来的1.6/7/8三个弟弟有了,但是为了和大哥一样,兄弟三人决定,代码中你写任你写,编译的时候我就悄悄的去掉...但是为什么都是Object类型呢,S不是继承了T么?从类型擦除的角度来说,编译的时候T和S都会被擦除掉,但是S是T的子类型这一点是肯定的。...); System.out.println(s); } 字节码如下: 从4和11看出T是String(Sting没有子类),S也是String,即在指定了具体类型之后,编译器知道T是String...总结 说白了编译时需要先声明,才能起到约束作用。方法中的要不然在类上定义,在创建类的时候指明具体类型,要不然就在定义方法的时候指明具体类型。 就酱,共勉,晚安。

38310
  • JAVA类型擦除

    是在JAVA 1.5版本中才引入的,它能和以前的版本兼容的原因是信息只存在于代码编译阶段,在进入 JVM 之前,与相关的信息会被擦除掉,即类型擦除。...通配符 如果在某些场景下我们不关注(或者不那么关注)对象的类型参数,可以使用通配符。...对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,以提高代码的重用率。...class java.lang.Object */ 通过反射我们在运行时得到了data的类型,发现都是Object,证明代码编译后所谓都没了,这就是擦除。...class java.lang.Number */ 通过反射绕过限制 从上面例子可以感受到,所谓,不过是编译过程及其之前才有的概念,主要还是为了方便开发。

    1.7K40

    Java探究及擦除机制和如何跳过编译阶段

    在这里贴上两句百度上对的解释:   Java 的参数只可以代表类,不能代表个别对象。   由于 Java类型参数之实际类型编译时会被消除,所以无法在运行时得知其类型参数的类型。...Java编译器在编译时会自动加入类型转换的编码,故运行速度不会因为使用而加快。   ...Java SE 1.5的新特性,的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为类、接口、方法。...Java语言引入的好处是安全简单。   的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,以提高代码的重用率。...List,然后进行比较 呐,两个List其实就是一个实例 ArrayList 和 ArrayList 在编译的时候是完全不同的类型,但是运行结果却是true,这就Java类型擦除造成的

    52630

    Java 用法 ( 编译期擦除 | 上界通配符 <? extends T> | 下界通配符 <? super T> )

    super T> 一、擦除 ---- 只保留到 编译期 , 在 编译完毕后 , 就不存在了 ; 在运行时 , 通过反射 , 调用类 , 即使违反了规则 , 也能进行相关操作 , 这是因为...在运行时 , 已经没有相关的限制 , 限制在编译时就已经被擦除了 ; 但是 的信息 , 保存在了常量表中 , 仍然可以获取到 ; 擦除 是为了 可以兼容 老版本的 JDK 而设计的..." Demo 中的 get 方法类型返回值是 Ljava/lang/Object , 不是 T , 这就是在字节码中被擦除了 ; descriptor: ()Ljava/lang/Object;...extends T> 类型 只能是 T 的子类 ; 只能在声明时使用 , 不能在 使用 时使用 ; public class Data ---- 下界通配符 : 类型 只能是 T 的父类 ; <?

    87910

    来实现编译时期的类型推断

    第一章都是讲的,距离上一篇Effective C#的随笔已经是很久以前的事情了。。。 今天Item4,讲的是类型推断功能。...首先上一段不用的代码。...但是这样意味着要写更多代码,写更多编译器和JIT引擎可以帮你实现的代码。 接下来上场,原文叫“correct answer”。...①类型转换。类中的LoadFromFile方法,返回的类型其实已经被限定了,就是T类型,至于T具体是什么类型,就看自己在调用的时候尖括号之间写的具体的值了。...最后一段: 很多时候如果用了Type类型的参数,通常都可以定义出一个的版本。编译器就会 “Create the Specific version for you.”。

    1.2K30

    揭开Java 类型擦除神秘面纱

    ,一个孤独的守门者。 大家可能会有疑问,我为什么叫做是一个守门者。这其实是我个人的看法而已,我的意思是说没有其看起来那么深不可测,它并不神秘与神奇。...除了可以将类型参数化外,而参数一旦确定好,如果类似匹配,编译器就不通过。 上面代码显示,无法将一个 String 对象设置到 cache2 中,因为让它只接受 Integer 的类型。...这是因为,信息只存在于代码编译阶段,在进入 JVM 之前,与相关的信息会被擦除掉,专业术语叫做类型擦除。 通俗地讲,类和普通类在 java 虚拟机内是没有什么特别的地方。...正常情况下,因为的限制,编译器不让最后一行代码编译通过,因为类似匹配,但是,基于对类型擦除的了解,利用反射,我们可以绕过这个限制。...,并不神奇 我们可以看到,其实并没有什么神奇的地方,代码能做的非代码也能做。 而类型擦除,是能够与之前的 java 版本代码兼容共存的原因。

    1.3K30

    Java基础篇:类型擦除

    一、什么是的本质是 参数化类型,也就是说 将所操作的数据类型 指定为一个参数,在创建新类的情况下,通过参数来指定所要操作的具体类型(类似于方法中的变量参数,此时类型也定义成参数形式),也就是说...的好处是在编译期检查类型安全,并能捕捉类型匹配的错误,避免运行时抛出类型转化异常ClassCastException,将运行时错误提前到编译时错误,消除安全隐患。...五、Java的实现方法–类型擦除: Java的实现是靠类型擦除技术实现的,类型擦除是在编译期完成的,也就是在编译期,编译器会将类型参数都擦除成它指定的原始限定类型,如果没有指定的原始限定类型则擦除为...object类型,之后在获取的时候再强制类型转换为对应的类型,因此生成的Java字节码中是包含中的类型信息的,即运行期间并没有的任何信息。...,也就是说,成功编译后的class文件是包含任何信息的。

    91621

    揭开Java 类型擦除神秘面纱

    ,一个孤独的守门者。 大家可能会有疑问,我为什么叫做是一个守门者。这其实是我个人的看法而已,我的意思是说没有其看起来那么深不可测,它并不神秘与神奇。...除了可以将类型参数化外,而参数一旦确定好,如果类似匹配,编译器就不通过。 上面代码显示,无法将一个 String 对象设置到 cache2 中,因为让它只接受 Integer 的类型。...这是因为,信息只存在于代码编译阶段,在进入 JVM 之前,与相关的信息会被擦除掉,专业术语叫做类型擦除。 通俗地讲,类和普通类在 java 虚拟机内是没有什么特别的地方。...正常情况下,因为的限制,编译器不让最后一行代码编译通过,因为类似匹配,但是,基于对类型擦除的了解,利用反射,我们可以绕过这个限制。...所以,我说,并不神秘,也神奇。

    1.1K10

    揭开Java 类型擦除神秘面纱

    ,一个孤独的守门者。 大家可能会有疑问,我为什么叫做是一个守门者。这其实是我个人的看法而已,我的意思是说没有其看起来那么深不可测,它并不神秘与神奇。...除了可以将类型参数化外,而参数一旦确定好,如果类似匹配,编译器就不通过。 上面代码显示,无法将一个 String 对象设置到 cache2 中,因为让它只接受 Integer 的类型。...这是因为,信息只存在于代码编译阶段,在进入 JVM 之前,与相关的信息会被擦除掉,专业术语叫做类型擦除。 通俗地讲,类和普通类在 java 虚拟机内是没有什么特别的地方。...正常情况下,因为的限制,编译器不让最后一行代码编译通过,因为类似匹配,但是,基于对类型擦除的了解,利用反射,我们可以绕过这个限制。...所以,我说,并不神秘,也神奇 。

    96540

    Java入门(16)-- 枚举类型

    的出现不仅可以让程序员少写一些代码,更重要的是它可以解决类型安全问题,提供了编译时的安全检查,不会因为将对象置于某个容器中而失去其类型。...在没有出现之前,Java也提供了对Object的引用“任意化”操作,这种“任意化”操作就是对Object引用进行向下转型及向上转型操作,但某些强制类型转换的错误也许不会被编译器捕捉,而在运行后出现异常...使用这种形式将不会发生ClassCastException异常,因为在编译器中就可以检查类型匹配是否正确。 在定义类时,一般类型名称使用T来表达,而容器的元素使用E来表达。...限制可用类型 默认可用使用任何类型来实例化一个类对象,但Java中也对类实例的类型作了限制。...类型参数只能是类类型,不可以是简单类型,如A这种定义就是错误的; 2. 类型个数可用是多个; 3. 可以使用extends关键字限制类型; 4.

    76730

    Java,你了解类型擦除吗?

    ,一个孤独的守门者。 大家可能会有疑问,我为什么叫做是一个守门者。这其实是我个人的看法而已,我的意思是说没有其看起来那么深不可测,它并不神秘与神奇。...除了可以将类型参数化外,而参数一旦确定好,如果类似匹配,编译器就不通过。 上面代码显示,无法将一个 String 对象设置到 cache2 中,因为让它只接受 Integer 的类型。...这是因为,信息只存在于代码编译阶段,在进入 JVM 之前,与相关的信息会被擦除掉,专业术语叫做类型擦除。 通俗地讲,类和普通类在 java 虚拟机内是没有什么特别的地方。...正常情况下,因为的限制,编译器不让最后一行代码编译通过,因为类似匹配,但是,基于对类型擦除的了解,利用反射,我们可以绕过这个限制。...,并不神奇 我们可以看到,其实并没有什么神奇的地方,代码能做的非代码也能做。 而类型擦除,是能够与之前的 java 版本代码兼容共存的原因。

    2.3K20

    Java类型擦除类型擦除参考资料

    本文首发于个人网站:Java阿杜 类型擦除 学过C++模板的,在使用Java的时候,会感觉到有点疑问,例如:(1)无法定义一个数组、无法调用参数对象中对应的方法(当然,通过extends...Java中的有这些问题,是它的实现机制决定的,即“类型擦除”。...类型擦除的定义:编译通过后,准备进入JVM运行时,就不再有类型参数的概念,换句话说:每定义一个类型,JVM会自动提供一个对应的原生类; public class Holder4 {...,不需要显式转型 Automobile b = holder4.getB(); Automobile c = holder4.getC(); } } 在Java中,每定义一个类型...Java依赖编译器实现,只存在于编译期,JVM中没有的概念;那么,编译器做了什么工作呢?

    61220

    转:Java ,你了解类型擦除吗?

    转载自 frank909 的文章 《Java ,你了解类型擦除吗?》 ---- ,一个孤独的守门者。 大家可能会有疑问,我为什么叫做是一个守门者。...除了可以将类型参数化外,而参数一旦确定好,如果类似匹配,编译器就不通过。...这是因为,信息只存在于代码编译阶段,在进入 JVM 之前,与相关的信息会被擦除掉,专业术语叫做类型擦除。 通俗地讲,类和普通类在 java 虚拟机内是没有什么特别的地方。...正常情况下,因为的限制,编译器不让最后一行代码编译通过,因为类似匹配,但是,基于对类型擦除的了解,利用反射,我们可以绕过这个限制。...所以,我说,并不神秘,也神奇。

    1.4K10
    领券