精华内容
下载资源
问答
  • 要求相关类都extend baseClass,就可以避免大多数重复代码,减少大部分工作。我一听不对呀,这不是以前吃过大亏吗?在等到同事介绍完所有优点时候,我简单说了句。“在框架设计时避免使用大量exte

    最近项目需要搭建一套基于springcloud的框架,在项目讨论会上。有同事说到做了一些basebean,basecontroller,baseservice,basedao等一些基础类。要求相关类都extend baseClass,就可以避免大多数重复代码,减少大部分的工作。我一听不对呀,这不是以前吃过的大亏吗?在等到同事介绍完所有的优点的时候,我简单的说了句。“在框架设计时避免使用大量extend”,由此引发的激烈的反驳。

    对方的理由主要是3点:

    1、java中extend是主要的特征之一,你居然说不能用。

    2、extend能减少一半的工作量,你居然说这样的设计不好。

    3、你连这些都不知道,怎么会如此的无知。

    因为我们是跨3个区域的电话会议,在现场并没有马上反驳对方。会议结束后,我私下联系同事。主要陈述了随着项目开发的推进base臃肿、代码侵入耦合、领悟驱动设计的思想以及对后期维护的影响,还举例了struts1和strats2的设计区别。当然对方应该是没有听进去,还举例了一些填鸭式的解决方案。

    主要理由是:

    1,等base臃肿的时候重构,

    2,base作为基础框架,类似于spring的作用。

    3、base的维护是有权限的,避免每个人都有修改的权限带来的系统不稳定性。

    讨论在这里我内心久久不能平静,我想这样的事情应该在大多数团队都存在,这也因该是中国软件技术的现状吧?其实在extend的优劣在网上已经有大量的讨论,我也没必要在这里重复。对于好学的人和有一定技术追求的人都能思考这样的问题。我的观点很明确,两种观点都能完成我们的项目设计和开发,从项目健壮性合理性我是支持避免extend的框架。这里我想是一个逻辑问题的思考,我的父亲是一个聪明的木工,我继承了他的聪明,但我并没有继续做木工,而是软件开发(不能强迫我去extend父亲一切)。

    下面说extend问题和解决问题的方法。
    问题主要是两点:
    1、对顶层超类的改动可能会使与其相关的所有子类出现不正确的操作。
    2、给子类的修改带来复杂度。
    3、extend的单继承的局限性。
    解决办法:
    1、使用设计模式

    类的组合或者装饰模式等 

    2、编写代码生成器



    由此我想就提问这个话题引发的思考,提问一般有三种情况:
    1、质疑
    2、反驳
    3、求证
    对于这三种情况大家应该都比较清楚区别。


    特别是在会议上,在别人陈诉时如果没有足够的考证不要打断别人。会议理当应该避免质疑的发言,因为在质疑别人之前务必要做好充分的准备和思考,否则引发的讨论都是在浪费大家的时间。我想在工作中和生活中,聆听别人的意见总会有一种收获。
    展开全文
  • public class TestType {public static void... extend B,在定义泛型时,只能接受B或B子类List extends B> list = new ArrayList();//编译通过list = new ArrayList(); //编译通过//list = new ArrayList(); /...

    public class TestType {

    public static void main(String[] args) {

    //? extend B,在定义泛型时,只能接受B或B的子类

    List extends B> list = new ArrayList();//编译通过

    list = new ArrayList(); //编译通过

    //list = new ArrayList(); //报错,编译不通过

    //除了null外,无论往集合中插入什么元素都报错,因为 extends E>只是告诉编译器集合中元素类型上限,

    //但它具体什么类型编译器不知道,也就是说它的类型是不确定的,既然不确定,为了类型安全,编译器只能阻止添加元素了

    //list.add(new A());//错误,编译不通过

    //list.add(new B());//错误,编译不通过

    list.add(null);

    //? super B,在定义泛型时,只能接受B或B的父类

    List super B> list1 = new ArrayList(); //编译通过

    list1 = new ArrayList(); //编译通过

    //list1 = new ArrayList(); //编译不通过

    //在add插入元素时,由于我们知道了集合中装的元素是B或B的父类,我们无法确定是具体哪个类型,

    //但是我们可以确定的是B和B的子类和“这个不确定类”是兼容的,因为它肯定是这个“不确定类”的子类,

    //所以我们可以往集合中添加B或B子类的对象

    list1.add(new C()); //编译通过

    list1.add(new B()); //编译通过

    //list1.add(new A()); //错误,编译不通过

    }

    }

    class A{

    }

    class B extends A{

    }

    class C extends B{

    }

    ? extend E : 指的是E及其E的子类,指定了泛型的上限(E),由于E是该范围内最上面的类,所以在list.add(具体类)是不可以的,因为只知道泛型的上限,但具体添加的对象和 list = new ArrayList<>(),中的类不一定匹配,会出现类型转换问题,所以干脆不可以添加。

    extends E> 在定义泛型时,只能接受E或E的子类,在往集合中插入元素时,由于 extends E>只是告诉编译器集合中元素类型上限,但它具体什么类型编译器不知道,也就是说它的类型是不确定的,既然不确定,为了类型安全,编译器只能阻止添加元素了

    补充:> 是 extends Object>的简写

    ? super E  : 指的是E及其E的父类,指定了泛型的下限(E),由于指定了泛型的下限E,所以添加的对象只能是E或者E的子类,这样就不会出现类型转换错误,这就可以添加了,编译成功。

    比如: List super Apple> apples; 表示集合中元素类型下限为Apple类型,即只能是Apple或Apple的父类,因此对于下面的赋值是合理:

    apples = new ArrayList();

    apples = new ArrayList();

    apples = new ArrayList();

    如果元素类型为Apple的子类,则编译不同过 :apples = new ArrayList();  //编译不通过

    再看看 super E>限定的集合的读写操作

    写入

    因为 apples中装的元素是Apple或Apple的某个父类,我们无法确定是哪个具体类型,但是可以确定的是Apple和Apple的子类是和这个“不确定的类”兼容的,因为它肯定是这个“不确定类型”的子类,也就是说我们可以往集合中添加Apple或者Apple子类的对象,所以对于下面的添加是允许的 :

    apples.add(new Apple());

    apples.add(new RedApple());

    读取

    编译器允许从apples中获取元素的,但是无法确定的获取的元素具体是什么类型,只能确定一定是Object类型的子类,因此我们想获得存储进去的对应类型的元素就只能进行强制类型转换了

    Apple apple = (Apple)apples.get(0);//获取的元素为Object类型

    问题来了,JDK1.5引入泛型的目的是为了避免强制类型转换的繁琐操作,那么使用泛型 super E>干嘛呢?我们可以使用 super E>写入数据。

    PECS法则

    那么这里,我们可以总结一条规律,“Producer Extends,Consumer Super”,意思是:

    Producer Extends:如果你需要一个只读的List,用它来produce T,那么使用 ?  extends T

    Consumer Super:如果你需要一个只写的List,用它来consumer T,那么使用 ? super T

    如果需要同时读取和写入,那么就不能使用通配符了。

    Java集合类的源码中,经常有将两者结合起来使用的,如:

    public class Collections{

    public static void copy(List super T> dest, List extends T> src) {

    int srcSize = src.size();

    if (srcSize > dest.size())

    throw new IndexOutOfBoundsException("Source does not fit in dest");

    if (srcSize < COPY_THRESHOLD ||

    (src instanceof RandomAccess && dest instanceof RandomAccess)) {

    for (int i=0; i

    dest.set(i, src.get(i));

    } else {

    ListIterator super T> di=dest.listIterator();

    ListIterator extends T> si=src.listIterator();

    for (int i=0; i

    di.next();

    di.set(si.next());

    }

    }

    }

    }

    展开全文
  • 在定义protobuf消息时,有时候需要用到extensions来对原有消息类型进行扩展,有利于消息定义重复使用。1、下面写一个最简单例子,定义一个message BaseData,并对其进行扩展:Example.proto:// 定义一个...

    在定义protobuf消息时,有时候需要用到extensions来对原有的消息类型进行扩展,有利于消息定义的重复使用。

    1、下面写一个最简单的例子,定义一个message BaseData,并对其进行扩展:

    Example.proto:

    // 定义一个message BaseData,100~199之间的tag可供扩展

    message BaseData {

    required int32 code = 1;

    extensions 100 to 199;

    }

    // 扩展BaseData,加上一个extend_data,tag为100

    extend BaseData {

    required string extend_data = 100;

    }

    运行protoc.exe --java_out=. Example.proto生成Example.java文件。

    Java代码:

    public static void main(String[] args) {

    Example.BaseData.Builder baseBuilder = Example.BaseData.newBuilder();

    baseBuilder.setCode(123);

    baseBuilder.setExtension(Example.extendData, "xxg");

    Example.BaseData baseData = baseBuilder.build();

    System.out.println(baseData.getCode());

    System.out.println(baseData.getExtension(Example.extendData));

    }

    这里需要调用setExtension方法来设置扩展的extendData。setExtension有两个参数,第一个定义扩展的是哪一个字段,Example.extendData即表示Example类中的extendData,第二个就是设置扩展字段的值。

    2、另外还有一种常用的扩展定义方式:

    Example.proto:

    // 定义一个message BaseData,100~199之间的tag可供扩展

    message BaseData {

    required int32 code = 1;

    extensions 100 to 199;

    }

    // 定义一个message Data

    message Data {

    required string msg = 1;

    // 扩展BaseData,加上一个Data类型的字段,tag为100

    extend BaseData {

    required Data extend_data = 100;

    }

    }

    这种方式看起来有点奇怪,实际上可以理解成这样:

    // 定义一个message BaseData,100~199之间的tag可供扩展

    message BaseData {

    required int32 code = 1;

    extensions 100 to 199;

    }

    // 定义一个message Data

    message Data {

    required string msg = 1;

    }

    // 扩展BaseData,加上一个Data类型的字段,tag为100

    extend BaseData {

    required Data extend_data = 100;

    }

    Java代码:

    public static void main(String[] args) {

    // 先构造一个message Data类型对象

    Example.Data.Builder dataBuilder = Example.Data.newBuilder();

    dataBuilder.setMsg("xxg");

    Example.Data data = dataBuilder.build();

    // 再构造message BaseData对象,将Data对象通过setExtension设置到BaseData中

    Example.BaseData.Builder baseBuilder = Example.BaseData.newBuilder();

    baseBuilder.setCode(123);

    baseBuilder.setExtension(Example.Data.extendData, data);

    Example.BaseData baseData = baseBuilder.build();

    System.out.println(baseData.getCode());

    System.out.println(baseData.getExtension(Example.Data.extendData).getMsg());

    }

    注意上面的Java代码用的是第一种proto消息定义方式,如果用的是下面第二种消息定义的方式,setExtension的参数Example.Data.extendData就应该改成Example.extendData,注意嵌套结构。

    原文:http://blog.csdn.net/xiao__gui/article/details/37874081

    展开全文
  • JAVAextend和implement区别

    千次阅读 2016-03-18 10:02:34
    个人觉得不管是继承还是接口实现,都是讲其它类功能或者属性传承到你所想要新建类中,但是不同是,由于java只能单继承,即一个类中只能继承一个父类,但是可以实现多个接口,弥补了java中只能实现单继承...
    个人觉得不管是继承还是接口的实现,都是讲其它类的功能或者属性传承到你所想要新建的类中,但是不同的是,由于java只能单继承,即一个类中只能继承一个父类,但是可以实现多个接口,弥补了java中只能实现单继承的不足。而且通常情况下我们利用继承是继承父类中的属性,实现接口是想要接口的功能。
    
    展开全文
  • 在类声明中,通过关键字extends来创建一个类子类。一个类通过关键字implements声明自己使用一个或者多个接口。 extends 是继承某个类, 继承之后可以使用父类方法, 也可以重写父类方法; implements 是实现多...
  • Java泛型中“通配符(Wildcards)”和“边界(Bounds)”概念。 extends T>:是指“上界通配符(Upper Bounds Wildcards)” super T>:是指“下界通配符(Lower Bounds Wildcards)”为什么要用通配符和边界?...
  • Java泛型中“通配符(Wildcards)”和“边界(Bounds)”概念。 extends T>:是指“上界通配符(Upper Bounds Wildcards)” super T>:是指“下界通配符(Lower Bounds Wildcards)”为什么要用通配符和边界?...
  • 字符相关: String, StringBuilder, StringBuffer集合相关:iterable是java顶级接口List,Set 都是继承自java.util.Collection接口 --> iterableList子类 :AbstractList直接实现了List, 并extend拓展自...
  • 一、extension用法由于extension是protobuf2中一个比较高级,但是在proto3中禁用功能,所以在这里还是看下这个内容实现,完整实现参考来自下面文章。为了避免跳转或者连接失效,这里把原文章内容拷贝一份:...
  • 一、泛化(Generanization)图:泛化简单说就是继承关系,在java中就是extend。表示一般与特殊关系。如鸭子是鸟一种,即有鸭子特性也有鸟共性。用带空心三角箭头实线指向父类。二、接口与实现图:这种...
  • 使用googelprotobuf2.3.0我protobuf文件中有2个扩展,我在java代码中怎样获取到这2个扩展值我值都已经赋好,但是在取值时候,怎么也取不出扩展中值,请各位大神帮忙,一下提...使用googel protobuf 2.3.0 ...
  • java学习--java的extend

    千次阅读 2019-03-21 20:56:47
    java继承是单继承,只能有一个父类,可以有多个子类。 子类在继承父类属性和方法时候可以拓展自己属性和方法。 继承父类时候,父类必须有一个无参构造。 子类构造时候会默认通过super()来调用...
  • 前言google开源Protocol Buffers(后面简称protobuf)作为一种结构化数据序列化和反序列化工具,在很多场景中都有应用,而extend的拓展机制又增加了很多可能性。下面通过一个示例来简单说明一下如何使用protobuf...
  • Vue中通过Vue.extend动态创建实例在Vue中,如果我们想要动态地来控制一个组件显示和隐藏,比如通过点击按钮显示一个对话框或者弹出一条信息。我们通常会提前写好这个组件,然后通过v-if = “show”来控制它显示...
  • [Java教程]jQuery插件扩展extend的实现原理0 2016-06-23 18:00:06相信每位前端小伙伴对jQuery都不陌生吧,它最大魅力之一就是有大量插件,去帮助我们更轻松实现各种功能。前几天晚上,闲来无事,就自己动手...
  • 经常发现有List super T>、Set extends T>声明,是什么意思呢? super T>表示包括T在内任何T父类, extends T>... foo3通配符声明,意味着以下赋值是合法://Number"extends...
  • 本文并非这部分可以参考官方文档,proto3语法在这里只做简要介绍和整理。一个 基础Message 定义如下syntax = "proto3";import "other.proto";message SearchRequest {string query = 1;int32 page_number = 2;...
  • Javaextend 与 implement 区别

    万次阅读 2013-08-15 13:44:34
    extends是继承父类,只要那个类不是声明为final或者那个类定义为abstract就能继承,JAVA中不支持多重继承,但是可以用接口来实现,这样就要用到implements,继承只能继承一个类,但implements可以实现多个接口,用...
  • 1. 在类声明中,通过关键字extends来创建一个类子类。一个类通过关键字implements声明自己使用一个或者多个接口。 extends 是继承某个类, 继承之后可以使用父类方法, 也可以重写父类方法; implements 是实现...
  • Java中,通过keywordextends继承一个已有类,被继承类称为父类(超类,基类),新类称为子类(派生类)。在Java中不同意多继承。(1)继承class Animal{void eat(){System.out.println("Animal eat");}void sleep...
  • 小编典典Reimeus已经指出,您在编辑中要求内容是不可能。我只想扩展一下原因。人们会认为您可以使用以下内容:public void mapThis(Class extends MyClass> key,Class extends U> value) { ... }实际上,...
  • Java继承(extend用法

    千次阅读 2018-12-22 21:38:07
    继承:从多个具体子类中抽取出相同属性以及行为,组合成一个新父类 然后让这些具体子类继承这个父类 继承关键字:extends ...java是一种单继承语言,但是它支持继承链 C++是多继承 继承优点: 1:提高...
  • extends是继承父类,只要那个类不是声明为final或者那个类定义为abstract就能继承,JAVA中不支持多重继承,但是可以用接口来实现,这样就要用到implements,继承只能继承一个类,但implements可以实现多个接口,用...
  • Java中,我们在实现继承时候存在下面几个事实:1, 准备两个类,他们用extends关键字链接起来2, 如果超类没有默认构造函数,需要在子类构造函数中显式super并传参,如果都是默认构造函数也可以super,不super...
  • OOP15-java的单继承extend

    2019-03-28 19:31:17
    OOP12-java的单继承extend 扩充 在已有的类(class)的基础上扩充出新的类。 示例 已有的类Account public class Account { private String accountID; private int balance; public void deposit(int ...
  • Java的角度理解Ext的extend 2011-12-27 11:14 Adley Adley的博客 我要评论(1) 字号:T | T 本文讲解了在实现继承时存在的一些问题,作者从Java的角度去讨论了Ext的extend这些问题。详细请看下文…… AD...
  • 继承:类和类一种关系 extends关键字狗类是子类,派生类 动物类是父类,基类1.一个类只能有一个直接父类2.多个类可以继承一个父类例:class A{}class B extends A{}class C extends A{} //类B和类C都可以继承...
  • Java语言并不支持多重继承,而只能继承一个类,不过我们可以使用implements来实现多个接口。extends继承父类:不能声明为final或者定义为abstract;implements实现接口interface,用逗号分开就好;如:class A ...

空空如也

空空如也

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

java的extend

java 订阅