精华内容
下载资源
问答
  • java 泛型通配符

    2019-11-12 21:24:17
    java 泛型通配符 使用场景:在进行引用传递时,接受同class名称的任意数据类型 ***************************************************** 使用示例 package hello; class A<T>{ private T t; ...

    java 泛型通配符

     

    应用:引用传递时,接受同class的任意对象

     

     

    **********************

    示例

     

    package hello;
    
    class A<T>{
    
        private T t;
    
        public T getT() {
            return t;
        }
    
        public void setT(T t) {
            this.t = t;
        }
    }
    
    public class MyTest3 {
    
        public static void fun(A<?> a){
            System.out.println(a.getT());
        }
    
        public static void main(String[] args){
            A<String> a=new A<>();
            a.setT("瓜田李下");
            fun(a);
    
            A<Integer> a2=new A<>();
            a2.setT(10);
            fun(a2);
        }
    }
    

     

    ******************

    控制台输出

     

    瓜田李下
    10

     

     

    展开全文
  • Java泛型通配符

    2019-03-30 01:46:05
    NULL 博文链接:https://mydownload.iteye.com/blog/1330570
  • java泛型通配符

    2019-09-12 03:58:14
    JAVA泛型通配符详解。 http://www.cnblogs.com/wxw7blog/p/7517343.html 转载于:https://my.oschina.net/u/116...

    JAVA的泛型通配符详解。 http://www.cnblogs.com/wxw7blog/p/7517343.html

    转载于:https://my.oschina.net/u/1161660/blog/3010904

    展开全文
  • Java 泛型通配符

    2020-11-25 17:44:55
    为何要使用泛型通配符 根据里氏替换原则,我们通常是用基类的引用指向子类对象,例如 class Shape {} class Circle extends Shape {} class Square extends Shape {} Shape shape = new Circle(); 对于泛型来说,...

    为何要使用泛型通配符

    根据里氏替换原则,我们通常是用基类的引用指向子类对象,例如

    class Shape {}
    class Circle extends Shape {}
    class Square extends Shape {}
    
    Shape shape = new Circle();
    

    对于泛型来说,下面的代码是错误的

    // 不支持这种泛型语法
    List<Shape> shapes = new ArrayList<Cirlce>();
    

    这种泛型语法被定义为错误的语法。由于泛型擦除,在运行时,系统并不知道 shapes 保存的对象的类型,那何谈确保添加正确类型的对象呢?

    泛型通配符上界

    如果我们仍然想建立这种关系,可以使用泛型通配符,由问号表示

    List<? extends Shape> shapes = new ArrayList<Circle>();
    

    ? extends Shape 定义了泛型的下界,也就是 Shape 类或者它的子类,但是我们似乎并不关心是什么子类型,这里我们只想要把 shapes 指向一个泛型类型为 Circle 的 ArrayList 对象。

    但是由于泛型擦除,编译期和运行期,都无法知道 shapes 到底保存了哪个类型,那么怎么能安全地向其中添加对象呢? 因此Java拒绝这种做法。例如下面代码是错误的

    List<? extends Shape> shapes = new ArrayList<Circle>();
    // 编译报错
    shapes.add(new Shape());
    

    这个错误我们完全可以解释的,add 方法的原型如下

    boolean add(T t);
    

    add 方法的参数类型是一个泛型,在编译期,编译器会在这里添加一个边界动作,也就是检测类型是否正确。 然而,此时编译器只知道泛型的类型为 ? extends Shape ,但是并不知道具体是哪个类型,那么就无法确保添加对象的类型正确。 因此这种语法被拒绝了。

    List<? extends Shape> shapes 连对象的无法添加,那么它存在的意义是什么呢? 由于 List<? extends Shape> 像是一个基类,因此用在方法的参数类型

    boolean isExists(List<? extends Shape> list, Shape obj) {
    	list.foreach(System.out::println);
    	return list.contains(obj);
    }
    

    从这个方法可以看出,我们可以对List<? extends Shape> list 进行遍历,这应该是理所当然的,但是遍历对象的类型只能是 Shape。

    然而居然可以对 List<? extends Shape> list 调用 contains 方法,我们刚在前面说过不能调用 add 方法,为何? 可以看下 contains 方法的原型

    boolean contains(Object obj);
    

    原来它的参数类型是 Object,这样就不用编译器来确保类型的正确, 因此List<? extends Shape> list 调用 contains 方法,也是理所当然的。

    泛型通配符下界

    ? extends Shape 表示了泛型通配符的的上界是 Shape, 而 ? super Cirlce 表示的泛型通配符的下界是 Circle 的基类。因此可以向这个集合中添加元素

    注意,泛型类的泛型参数不能使用<T super MyClass> 这种形式,但是在泛型类的内部可以使用 <? super T>。

    List<? super Circle> circles = new ArrayList<>();
    circles.add(new Circle();
    

    ? super Circle 只是指定了下界,由于泛型擦除,我们并不知道具体保存了什么类型,所以从 List<? super Circle> circles 获取的元素只能是 Object 类型,如下

    List<? super Circle> circles = new ArrayList<>();
    circles.add(new Circle()
    
    // 获取的元素只能是 Object 类型
    Object obj = circles.get(0);
    
    展开全文
  • java泛型 通配符

    2018-02-06 15:08:00
     java泛型中,提供了通配符实现这种类的定义:以通配符“?”替代泛型尖括号中的具体类型,表明该泛型的类型是一种未知的类。  例如Cage<?>可以认为是Cage<Animal>,Cage<Butterfly>,Cage<...

        Java允许在泛型的类型形参中使用通配符,以提高程序的灵活性。

        java泛型中,提供了通配符实现这种类的定义:以通配符“?”替代泛型尖括号中的具体类型,表明该泛型的类型是一种未知的类

        例如Cage<?>可以认为是Cage<Animal>,Cage<Butterfly>,Cage<Fruit>的父类/

        在上述feedAnimals()中,需要定义所有动物笼子的父类。这可以通过使用受限通配符来实现:Cage<? extends Animals>.

     

        

    import java.util.*;
    public class Cage<E> extends LinkedList<E>{};

    class Animal{
    public void feedMe(){};
    public void LoveMe(){};
    }

    class Lion extends Animal{
    public void feedMe() {
    System.out.println("Feeding lions");
    }
    }

    class Xyx extends Animal{
    public void LoveMe() {
    System.out.println("Loving Xyx");
    }
    }

     

    package practice;

    public class WildcardsTest {

    public static void main(String[] args) {
    // TODO Auto-generated method stub
    WildcardsTest t = new WildcardsTest();
    Cage<Lion> lionCage = new Cage<Lion>();
    Cage<Xyx> loveXYX = new Cage<Xyx>();
    lionCage.add(new Lion());
    loveXYX.add(new Xyx());
    t.feedAnimals(lionCage);
    t.feedAnimals(love);
    }

    void feedAnimals(Cage<? extends Animal>someCage) {
    for(Animal a:someCage) {
    a.feedMe();
    a.LoveMe();}
    }
    }

     

    输出:

    Feeding lions
    Loving 

    转载于:https://www.cnblogs.com/tiandiou/p/8422467.html

    展开全文
  • JAVA 泛型通配符

    2019-09-03 11:57:53
    泛型Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。 这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处...
  • JAVA泛型通配符

    2020-08-18 23:31:56
    一、通配符的上界 List <Cat <并不是List <Anilmal <的子类型; “?”就是通配符,而“? extends Animal”则表示通配符“?”的上界为Animal, 换句话说就是,“? extends Animal”可以代表Animal或其...
  • Java 泛型 通配符

    2019-03-07 21:28:54
    泛型类的定义: 在类声明时通过一个标识符表示类中某个字段的类型或者某个方法的返回值或参数的类型 ,在类声明或实例化时只需要指定自己需要的类型即可。 声明带泛型的类: class 类名&lt;泛型类型 1,泛型类型 2...
  • java 泛型 通配符

    2018-08-29 06:08:24
    实现了参数化类型的概念 通过泛型解耦类的方法与所使用的类型之间的约束 参数化类型 指定一个类型作为实参 由修改该类的代码所提供的类型 来将该类进行参数化 具体类型实例化 插入一个实际的java类型作为参数 ...
  • java泛型通配符

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,525
精华内容 1,410
关键字:

java泛型通配符

java 订阅