java 泛型使用 LinkedList<? extends A> 出错 参数不适用

问题描述

importjava.util.LinkedList;publicclassTest{publicstaticvoidmain(String[]args){LinkedList<?extendsA>list=null;list=newLinkedList<B>();list=newLinkedList<C>();list.add(newC(12));//报错}}abstractclassA{publicA(){}publicabstractintget();publicabstractvoidset(intnum);}classBextendsA{privateintb;publicB(intnum){b=num;}publicintget(){returnb;}publicvoidset(intnum){this.b=num;}}classCextendsA{privateintc;publicC(intnum){c=num;}publicintget(){returnc;}publicvoidset(intnum){this.c=num;}}------------------------------------------报错类型LinkedList<capture#3-of?extendsA>中的方法add(capture#3-of?extendsA)对于参数(C)不适用请问有谁知道为什么会出错?

解决方案

解决方案二:
//对象可以使用父类引用指向子类对象,集合不可以,泛型必须精确类型//把LinkedList<?extendsA>list改为LinkedList<C>listLinkedList<C>list=null;//LinkedList<?extendsA>list=null;list=newLinkedList<C>();list.add(newC(12));
解决方案三:
谢谢回复也就是说如果不使用泛型集合类例如MyClass<?extendsA>myClass=null;myClass=newMyClass<C>();myClass.add(newC(12));就没问题咯?
解决方案四:
LinkedList<?extendsA>list=null;这句话表明list中存的是A的子类,但这种描述是模糊的,不能确定到底是哪个子类,可能是B,也可能是C,所有编译器只允许list.add(null).因为null是所有类的子类。不过可以将extends改成super,这样上面就不会报错了,因为LinkedList<?superA>list=null;表明?是A的父类,那么不论是B还是C必然都是?的子类,故不报错。建议楼主去研究下上下边界通配符类型的get,set使用。附:当使用get方法时,尽量用上边界限定通配符当使用set或add方法时,尽量使用下边界限定通配符

时间: 2024-12-21 22:09:10

java 泛型使用 LinkedList&amp;lt;? extends A&amp;gt; 出错 参数不适用的相关文章

关于java泛型问题,为什么把extends改为super就不会出错

问题描述 关于java泛型问题,为什么把extends改为super就不会出错 class Employee{ } class Manager extends Employee{ }class CEO extends Manager{ }public class Test{ public static void main(String[] args) { List<? super Manager> list=new ArrayList();//编译不会出错 //List<? extend

Java 泛型中super T和extends T的区别

经常发现有List< super T>.Set<extends T>的声明,是什么意思呢?< super T>表示包括T在内的任何T的父类,< extends T>表示包括T在内的任何T的子类,下面我们详细分析一下两种通配符具体的区别. extends List< extends Number> foo3的通配符声明,意味着以下的赋值是合法的:    // Number "extends" Number (in this co

java泛型-Java泛型上下限super和extendS的使用区别,谢谢

问题描述 Java泛型上下限super和extendS的使用区别,谢谢 class DemoF{ public static void printA(Collection<?super Cat> c){ 相同的方法体,例如打印集合} public static void printB(Collection<?extend Animal> c){相同的方法体,例如打印集合} public static void main(String[ ] args){ Collection<

Java泛型中extends和super的理解(转)

E – Element (在集合中使用,因为集合中存放的是元素) T – Type(Java 类) K – Key(键) V – Value(值) N – Number(数值类型) ? – 表示不确定的java类型(无限制通配符类型) S.U.V – 2nd.3rd.4th types Object – 是所有类的根类,任何类的对象都可以设置给该Object引用变量,使用的时候可能需要类型强制转换,但是用使用了泛型T.E等这些标识符后,在实际用之前类型就已经确定了,不需要再进行类型强制转换. ?

从零开始来看一下Java泛型的设计

引言 泛型是Java中一个非常重要的知识点,在Java集合类框架中泛型被广泛应用.本文我们将从零开始来看一下Java泛型的设计,将会涉及到通配符处理,以及让人苦恼的类型擦除. 泛型基础 泛型类 我们首先定义一个简单的Box类: public class Box { private String object; public void set(String object) { this.object = object; } public String get() { return object;

java泛型type体系整理

一直对jdk的ref使用比较模糊,早上花了点时间简单的整理了下,也帮助自己理解一下泛型的一些处理.   java中class,method,field的继承体系     java中所有对象的类型定义类Type   说明:    Type :  Type is the common superinterface for all types in the Java programming language. These include raw types, parameterized types, 

通过Java泛型实现数组排序和搜索的通用方法

下面讨论的是数组的排序和搜索功能,而一个通用方法则是实现Comparable接口的方法,这个方法需要通过java泛型来实现.下面便逐步讲解为何,以及如何通过Java泛型实现此类的通用方法. 如何在java类中一些通用方法,特别是一些静态的工具方法? 比如,数组Arrays的sort.search等? 1. 整数数组的顺序收缩 public static int seqSearch(int[] arr, int first, int last, int target) { for (int i =

java泛型上下限

v前言: java的泛型上下限不是很好理解,尤其像我这种菜鸡.反反复复看了好几遍了...,真是... v一.简单的继承体系 class Person{} class Student extends Person{} class Worker extends Person{} v二.泛型上限(extends 关键字) public static void upperBound(List<? extends Person> list, Person p){ //正确,因为null没有类型信息 li

问一个Java泛型与类继承的问题

问题描述 问一个Java泛型与类继承的问题 直接上代码了 //DeviceRepository类 public abstract class DeviceRepository<T extends Device> extends DomainRepository<T> //DeviceEventHandler类第一种写法 public abstract class DeviceEventHandler<M extends Device,R extends DeviceRepos