今天,想使用Timber来打印日志,却发现一句常用的代码出了问题。
首先,我们添加依赖:
implementation 'com.jakewharton.timber:timber:5.0.1'
然后初始化Timber:
Timber.plant(new Timber.DebugTree());
就这么一句简单的java初始化代码,Android Studio却提示我报错。如下:
plant方法需要的参数是一个Tree,我们传入的是一个DebugTree,而DebugTree继承自Tree,为什么不行啊,于是我就用Tree变量来接收DebugTree实例,如下:
真是见鬼了,父类引用不能保存子类引用了,难道他们不是父类和子类的关系吗?于是写了下面的实验代码:
Log.i("ABCD", Timber.Tree.class.getName());
Log.i("ABCD", Timber.DebugTree.class.getSuperclass().getName());
运行结果如下:
timber.log.Timber$Tree
timber.log.Timber$Tree
这说明他们就是父类子类的关系啊,于是我再写下下面的代码来证明一下:
提示我这两个class不能使用==进行比较,真是活久见!然后我使用快捷键Ctrl + Alt + V把这两个class先提取为局部变量,以便看看其类型,如下:
这样看起来泛型中的类型确实不一样,那我有办法,我改为一样的类型,都使用问号通配符,如下:
这样就可以使用==进行比较了,打印结果如下:
isSame = true
这充分说明Tree和DebugTree是父子关系。于是我就想,那这个报错是IDE的问题,是不是不影响运行呢,于是不管他报错了,直接调用打印log的代码运行看看,如下:
运行一切正常,log正常输出,哎,真是恶了个心,我还以为是哪里不对呢!如果对于强迫证不喜欢看到红线报错,则可以使用反射解决,如下:
这样就没有红线了,哎,心累!
考虑到Timber的新版本是修改为kotlin语言了,于是猜想会不会是这个问题导致的?于是创建一个kotlin语言的android项目,再写同样的代码,发现就不报错了,如下:
真是奇了个怪!