<? extends ...>与<? super ...>区别与理解

一、<? extends …>

extends指上界通配符,示例中指的是所有Fruit类及其派生的子类。
在这里插入图片描述
对该通配符指示的容器进行写入操作(set),就像收到一个包裹,上面写了包裹里都是水果,但编译器并不事先知道具体是哪一种水果,如果里面是香蕉,但放入了一个苹果就会造成错误,所以编译器禁止这种操作。

public void Func( List <? extends Fruit> temp) 
{
  temp.set(...); //compile time error
}

而对该通配符指示的容器进行读取操作(get),就像从包裹里拿一个水果,传递给一个Fruit对象。编译器无需关心到底是什么水果,因为Fruit类一定是该水果的超类,用Fruit对象调用的方法一定是该水果定义了的,不会发生错误。

二、super

super指下界通配符,示例中指的是所有Fruit类及其超类。
在这里插入图片描述

对该通配符容器进行读取(get)操作,就像收到一个包裹,里面是水果或者食物,但编译器不知道到底是什么,如果拿出一个并传递给一个Fruit对象,就有可能发生"超类对象被子类引用调用一个不存在的方法",造成错误。

public void Func( List <? super Fruit> temp) 
{
  Fruit a = temp.get();   //compile time error . 
                          //if not so,assume return an Food obj, refered by a Fruit variable,it seems to be ok
  //a.Fruitcolor();      // Food obj don't have a method defined in Fruit class, oop! 
}

而对其进行写入(set)操作,就像向包裹中放入东西,只要保证放入的东西是Fruit的子类,编译器无需直到容器具体的类型,就可以保证容器不会“调用一个不存在的方法”

三、总结

总结起来,编译器检查,如果可以确保总是用超类变量引用其子类对象,那么之后通过该变量调用的方法,一定在子类中已被定义。
而一旦出现用子类变量引用超类对象的情况,尽管其后也许并不一定发生错误,但编译器无法确定这一点,只能触发编译错误。

摘自:
作者:BJChangAn
链接:https://www.jianshu.com/p/447e13647824
来源:简书

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
南京工程学院 实 验 报 告 课程名称 JAVA基础 实验项目名称 图形用户界面设计 实验学生班级 实验学生姓名 学    号 同组学生姓名 实验时间 实验地点 实验成绩评定 指导教师签字 年 月 日 实验目的和要求 1.掌握Java Swing组建的使用方法,包括窗口、框架、对话框、面板、文本编辑框、按钮、组合框等 多种布局方式,掌握窗口菜单和快捷菜单设计方式。 理解委托时间处理模型,掌握不同组件、不同事件的事件处理方法,设计出能够响应事 件的Java图形用户界面。 熟悉在组件上绘图的方法。 二、实验题目 用表格存储并显示个人所得税税率表,给定一个月收入值,计算应缴的个人所得税。 实验方法与步骤(需求分析、算法设计思路、流程图等) 算法设计思路:本次实验题目为计算个人所得税,所以本人从网上找到了国家最新 的税收政策,以下为截图: 因此,我设计了以下核心算法 public void actionPerformed(ActionEvent e) { if(e.getSource()==button_b) { double wage=Double.parseDouble((String)text_wage.getText()); double tax = 0; if(wage<=3500) tax=0; if(wage>3500&&wage<=5000) tax=(wage-3500)*0.03; if(wage>5000&&wage<=8000) tax=(wage-3500)*0.1-105; if(wage>8000&&wage<=12500) tax=(wage-3500)*0.2-555; if(wage>12500&&wage<=38500) tax=(wage-3500)*0.25-1005; if(wage>38500&&wage<=58500) tax=(wage-3500)*0.3-2755; if(wage>58500&&wage<=83500) tax=(wage-3500)*0.35-5505; if(wage>83500) tax=(wage-3500)*0.45-13505; text.setText(""+tax); } } 以上算法是根据税率表设计的,具体为: 我国规定个人收入在3500元起征个人所得税,分了多个阶段: 3500以下:不收税 3500以上到5000以下部分:3% 5000以上到8000以下部分:10% 8000以上到以下部分:20% 125000以上到385000以下部分:25% 385000以上到585000以下部分:30% 585000以上到835000以下部分:35% 83500以上:45% 首先算出每个阶段的速扣数,然后用此公式: 应纳个人所得税税额=(应纳税所得-扣除标准)*适用税率-速算扣除数。 然后就得出以上算法。 四、实验原始纪录(源程序、数据结构等) import java.awt.*; import java.awt.event.*; import javax.swing.*; public class WageJFrame extends JFrame implements ActionListener { private JTable table;//表格 private Button button_b;//按钮 private Object datas[][];//数据 String titles[];//标题(为空) private JTextField text;//个人所得税 private JTextField text_wage;//输入的工资 public WageJFrame() { super("计算个人所得税"); Dimension dim=getToolkit().getScreenSize();//获得屏幕分辨率 this.setBounds(dim.width/4,dim.height/4,dim.width/2,dim.height/2);//设置窗口 大小 this.setDefaultCloseOperation(EXIT_ON_CLOSE);//关闭窗口 this.datas=new Object[8][4];//设置表格长宽 JLabel label=new JLabel("工资");//"工资"标签 text_wage=new JTextField("5000",7);//默认工资 JPanel jpane1=new JPanel();//面板 jpane1.add(label);//把标签加入面板中 jpane1.add(text_wage);//把输入工资的文本框加入面板中 this.getContentPane(
Android 开发 (实验四) 实验题目:Activity生命周期验证试验 指导老师: 班 级:计算机科学与技术系班 姓 名:( 1. 实验目的 1、深入理解Activity运行机制和原理。 2、掌握Activity的声明周期各个阶段工作流程。 3、掌握多个Activity之间生命周期的转换过程。 4、通络Intent实现多页面之间数据的传递(辅助完成)。 2. 实验内容 1. 搭建任意组件,设计多个界面,运行程序观察其生命周期的情况。 2. 使用Intent实现页面之间数据的传递。 3. 实验代码 AlifecyfleActivity.java package com.wr; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class AlifecycleActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button BtnStart = (Button) findViewById(R.id.BtnStart); BtnStart.setOnClickListener(new MyBtnClickListener()); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); System.out.println("AlifecycleActivity:onDestroy()"); } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); System.out.println("AlifecycleActivity:onPause()"); } @Override protected void onRestart() { // TODO Auto-generated method stub super.onRestart(); System.out.println("AlifecycleActivity:onRestart()"); } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); System.out.println("AlifecycleActivity:onResume()"); } @Override protected void onStart() { // TODO Auto-generated method stub super.onStart(); System.out.println("AlifecycleActivity:onStart()"); } @Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); System.out.println("AlifecycleActivity:onStop()"); } public class MyBtnClickListener implements OnClickListener { //重写点击事件处理方法 public void onClick(View arg0) { // TODO Auto-generated method stub Intent intent = new Intent(AlifecycleActivity.this,AlcActivity2.class);//创建意图对象 //使用意图对象打开一个新的Activity startActivity(intent); } } } AlcActivity.java package com.wr; imp
`Function<? super T, ? extends Stream<? extends R>> mapper`是一个函数式接口`Function`的方法签名,其中: - `T`是函数的输入类型 - `R`是函数的输出类型 这个函数式接口的作用是将一个类型为`T`的输入对象映射为一个类型为`Stream<? extends R>`的输出流,因此它的方法签名为`apply(T t): Stream<? extends R>`。 具体来说,`? super T`表示`T`的父类型,其中`super`是Java中的通配符边界符。这意味着该函数可以接受`T`类型的对象或其某个父类类型的对象作为输入。而`? extends Stream<? extends R>`表示一个`Stream`类型的子类型,它的元素类型是`R`或`R`的子类型。 这种方法签名通常在Java 8中的流式计算中使用,例如`flatMap()`方法,它可以将一个流中的每个元素映射为一个流,然后将这些流合并成一个流。在这种情况下,`mapper`参数就是一个函数,它将流中的每个元素映射为一个流。例如: ```java List<List<Integer>> list = Arrays.asList( Arrays.asList(1, 2, 3), Arrays.asList(4, 5, 6), Arrays.asList(7, 8, 9) ); List<Integer> result = list.stream() .flatMap(line -> line.stream()) // 将每个列表转换为流 .collect(Collectors.toList()); System.out.println(result); // 输出 [1, 2, 3, 4, 5, 6, 7, 8, 9] ``` 在这个例子中,我们首先创建了一个包含三个包含整数的列表的列表`list`,然后使用`flatMap()`方法将每个内部列表转换为流。在这个方法中,`mapper`参数是一个函数,它将每个内部列表映射为一个流。在这里,这个函数是`line -> line.stream()`,它将每个内部列表转换为一个流。最后,我们使用`collect()`方法将所有元素收集到一个列表中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值