Skip to main content

Posts

泛型中 extends 和 super 的区别?

泛型中 extends 和 super 的区别? <? extends T> 和 <? super T> 是Java泛型中的“通配符(Wildcards)”和“边界(Bounds)”的概念 <? extends T>  :是指 上界通配符(Upper Bounds Wildcards) <? super T>  :是指 下界通配符(Lower Bounds Wildcards) 为什么要用通配符和边界? 使用泛型的过程中,经常出现一种很别扭的情况。比如按照题主的例子,我们有Fruit类,和它的派生类Apple类。 class Fruit {} class Apple extends Fruit {} 然后有一个最简单的容器:Plate类。盘子里可以放一个泛型的“东西”。我们可以对这个东西做最简单的“放”和“取”的动作:set( )和get( )方法。 public class Plate <T> { private T item; public Plate ( T item ) { this . item = item; } public T getItem () { return item; } public void setItem ( T item ) { this . item = item; } } 现在我定义一个“水果盘子”,逻辑上水果盘子当然可以装苹果。 Plate< Fruit > plate = new Plate< Apple > ( new Apple ()); 但实际上Java编译器不允许这个操作。会报错,“装苹果的盘子”无法转换成“装水果的盘子”。 error: incompatible types: Plate<Apple> cannot be converted to Plate<Fruit> 所以我的尴尬症就犯了。实际上,编译器脑袋里认定的逻辑是这样的: 苹果 IS-A 水果 装苹果的盘子 NOT-IS-A 装水果的盘子 所以,就算容器里装的东西之间有继承关系,但容器之间是没有继承关

上传代码到Jcent仓库

首先需要注册jcent账号,注意选择  Sign Up to an Open Source account  ,否则将会是一个收费的账号。如下图所示: 进入正题 1. 首先需要在项目的build.gradle添加 classpath 'com.novoda:bintray-release:0.9.1' 2.在需要上传的库的build.gradle添加下面的几句代码 apply plugin: 'com.novoda.bintray-release' publish {     repoName = 'saas'//远程仓库名字,不指明,默认是上传到maven     userOrg = 'tiger'//bintray.com用户名     groupId = 'com.tiger.saas.widget'//jcenter上的路径,bintray上创建Package时填写的Version control项     artifactId = 'charts'//项目名称,bintray上创建Package时填写的Name项     publishVersion = '0.0.1'//版本号     desc = 'saas charts library'     website = 'https://github.com/ChinaVolvocars/Charts_App' } 3. 使用下面的命令上传即可 #### 上传命令 ```gradlew #### 上传命令 ```gradlew gradlew generatePomFileForReleasePublication gradlew publishReleasePublicationToMavenLocal gradlew bintrayUpload -PbintrayUser=xxx -PbintrayKey=xxx -PdryRun=false ``` 注意:-PbintrayUser=xxx 这几个xxx是用户名,-PbintrayKey=xxx

ART环境下基于主动调用的自动化脱壳方案

一、App启动流程 这里以一张图说明App进程的创建流程: 通过Zygote进程到最终进入到app进程世界,我们可以看到ActivityThread.main()是进入App世界的大门,下面对该函数体进行简要的分析,具体分析请看文末的参考链接。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 5379      public   static   void   main(String[] args) { 5380          Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,  "ActivityThreadMain" ); 5381          SamplingProfilerIntegration.start(); 5382 5383          // CloseGuard defaults to true and can be quite spammy.  We 5384          // disable it here, but selectively enable it later (via 5385          // StrictMode) on debug builds, but using DropBox, not logs. 5386          CloseGuard.setEnabled( false ); 5387 5388          Environment.initForCurrentUser(); 5389 5390          // Set the reporter for event logging in libcore 5391          EventLogger.setRe