Java,泛型类型通配符和C#对照

c#的泛型没有类型通配符,原因是.net的泛型是CLR支持的泛型,而Java的JVM并不支持泛型,仅仅是语法糖,在编译器编译的时候都转换成object类型

类型通配符在java中表示的是泛型类型的父类

public void test(List<Object> c)
{
      for(int i = 0;i < c.size();i++)
      {
             System.out.println(c.get(i));
      }
}  
//创建一个List<String>对象
List<String> strList = new ArrayList<String>();
//将strList作为參数来调用前面的test方法
test(strList);  

编译上面的程序,test(strList) 处将发生编译错误,意味着不能把List<String> 当成List<Object> 的子类. 这时候就须要使用类型通配符了,通配符是一个?号

上面的List<Object>换成List<?>就能够通过编译了

public void test(List<?> c)
{
      for(int i = 0;i < c.size();i++)
      {
             System.out.println(c.get(i));
      }
}  

List<String> 能够作为 List<?> 的子类来使用, List<?> 则可作为不论什么List 类型的父类使用,

假设仅仅想作为List<String>的父类,而不是List<int>呢,? 写成这样 List<?

extends String>

在C#中约束泛弄类型是这样

class MyClass<T, U>
    where T : class
    where U : struct
{}  
interface IMyInterface
{
}  

class Dictionary<TKey, TVal>
    where TKey : IComparable, IEnumerable
    where TVal : IMyInterface
{
    public void Add(TKey key, TVal val)
    {
    }
}  

Java 中约束泛型通配符上限:

//表明T类型必须是Number类或其子类,并必须实现java.io.Serializable接口
Public class Apple<T extends Number & java.io.Serializable>
{}  
时间: 2024-08-05 08:39:10

Java,泛型类型通配符和C#对照的相关文章

Java,泛型类型通配符和C#对比

指令系统 指令系统是计算机硬件的语言系统,与硬件的联系息息相关. 指令系统是指CPU所能够处理的全部指令的集合,是一个CPU的根本属性(指令系统决定了一个CPU能运行 什么样的程序).现在cpu仍然使用者X86指令集,不同类型的计算机包含的指令系统的种类和数目是不同的. 所有采用高级语言编出的程序,都需要编译或者解释成为机器语言后才能运行(编译原理),这些机器语 言中所包含的就是一条条的指令.一条指令就是机器语言的一个语句,它是一组有意义的二进制代码. 格式 零地址 在堆栈型计算机中,操作数一般

Java泛型通配符学习 —— Java Generic&#39;s Wildcards

Java Generic's wildcards is a mechanism in Java Generics aimed at making it possible to cast a collection of a certain class, e.g A, to a collection of a subclass or superclass of A. This text explains how. 理解:Java的泛型通配符机制旨在实现集合的类型转换.例如集合A,转换为A的子类集合或

java c# 加密与解密对照

原文 java c# 加密与解密对照 最近一直烦恼,java , c# 加密的不同,然后整理了一下,留个备份的轮子: 其中在 java.c#加密转换时,最重要的是 IV 的确定,我常常用如下方法使得java和c#之间的 IV 可以转换: 将其中某个 IV 数组转为 10进制后,在转换为相应的 byte数组就好了.10进制数组成为 java.c# 中IV转换的桥梁了.最后分别有java(我用myeclipse)和c#的编译器(SharpDevelop2很轻量级的编译器,但是运行代码后需要在后面写上

JAVA泛型通配符T,E,K,V区别,网友回复:一文秒懂

先解释下泛型概念泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法.Java语言引入泛型的好处是安全简单. 在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的"任意化","任意化"带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的.对于强制类型转换错误的

Java泛型-- 通配符

转自:http://blog.csdn.net/flfna/article/details/6576394 ———————————————————————————————————————————— 通配符 在本文的前面的部分里已经说过了泛型类型的子类型的不相关性.但有些时候,我们希望能够像使用普通类型那样使用泛型类型: ◆ 向上造型一个泛型对象的引用 ◆ 向下造型一个泛型对象的引用 向上造型一个泛型对象的引用 例如,假设我们有很多箱子,每个箱子里都装有不同的水果,我们需要找到一种方法能够通用的处

java泛型通配符?

转自:http://www.linuxidc.com/Linux/2013-10/90928.htm T  有类型 ?  未知类型 一.通配符的上界 既然知道List<Cat>并不是List<Anilmal>的子类型,那就需要去寻找替他解决的办法, 是AnimalTrianer.act()方法变得更为通用(既可以接受List<Animal>类型,也可以接受List<Cat>等参数).在java里解决办法就是使用通配符"?",具体到Anim

java泛型通配符和类型参数的范围

本节先讲解如何限制类型参数的范围,再讲解通配符(?). 类型参数的范围 在泛型中,如果不对类型参数加以限制,它就可以接受任意的数据类型,只要它是被定义过的.但是,很多时候我们只需要一部分数据类型就够了,用户传递其他数据类型可能会引起错误.例如,编写一个泛型函数用于返回不同类型数组(Integer 数组.Double 数组等)中的最大值: public <T> T getMax(T array[]){ T max = null; for(T element : array){ max = ele

理解Java泛型 通配符 ? 以及其使用

什么是泛型: 泛型从字面上理解,是指一个类.接口或方法支持多种类型,使之广泛化.一般化和更加通用.Java中使用Object类来定义类型也 能实现泛型,但缺点是造成原类型信息的丢失,在使用中容易造成ClassCastException. Java泛型带到的好处: 使得一个类或方法中的类型参数化,最终达到代码复用的效果.( 不使用泛型,你可能需要每种情况的类或方法都要定义一遍 ) 实现类型检查的功能,避免ClassCastException.(这是相对于使用Object类型实现泛型而言.因为我可以

java泛型---通配符,泛型嵌套

package generic; import java.util.ArrayList; import java.util.List; /** * ? -->通配符,类型不确定,用于声明 变量|形参 上 * 不能用在: * 1,创建对象 * 2,创建泛型类 .泛型方法.泛型接口上 * */ public class WildcardTest { public static void main(String[] args) { //声明 List<?> list = new ArrayLi