小编f2p*_*eek的帖子

从Kotlin中的密封类扩展数据类

我有一组共享一些公共字段的数据类,所以理想情况下我想用超类型(在这个例子中为Message)声明它们,并且如果需要访问这些公共字段,则能够编写对超类型进行操作的函数.字段(本例中为messageId).

fun operate(m: Message) {
  use(m.messageId)
}
Run Code Online (Sandbox Code Playgroud)

我试图通过从密封类扩展我的数据类来实现这一目标.

数据类可以扩展密封类,但不是我不确定它们是否可以接受"超类型"密封类所需的参数.

  1. 从密封类扩展常规类编译就好了.

    sealed class Message(val messageId: String)
    
    class Track(val event: String, messageId: String): Message(messageId)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 但是,将其更改为数据类不会编译("Data class主构造函数必须只有property(val/var)参数.").

    sealed class Message(val messageId: String)
    
    data class Track(val event: String, messageId: String): Message(messageId)
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将参数声明为属性也不会编译("'messageId'隐藏超类型'Message'的成员,需要'override'修饰符'").

    sealed class Message(val messageId: String)
    
    data class Track(val event: String, val messageId: String): Message(messageId)
    
    Run Code Online (Sandbox Code Playgroud)
  4. 打开supertype属性并在每个基类中重写它可以很好地编译:

    sealed class Message(open val messageId: String)
    
    data class Track(val event: String, override val messageId: String): Message(messageId)
    
    Run Code Online (Sandbox Code Playgroud)

理想情况下,我希望接近选项2 - 它允许我结合两个世界的最佳.

否则,似乎我的选择是使用选项1手动输入我自己的数据类功能(copy,hashcode,equals等),或者通过使用选项4打开超类型属性来实现折衷.

kotlin

33
推荐指数
1
解决办法
6163
查看次数

Java中的树实现(root,父级和子级)

我需要创建一个类似于Java中附加图像的树结构.我发现了一些与此相关的问题,但我没有找到令人信服且解释清楚的答案.应用程序业务包括食品超级类别(主菜,甜点和其他).这些类别中的每一个都可以包含父项或子项等.

期望的树结构

java tree structure

28
推荐指数
3
解决办法
13万
查看次数

改造中的动态路径

我正在尝试使用类似的方式访问资源http://192.168.1.64:5050/api/{api_key}/updater.info.

我该如何动态设置api_key参数?我试过使用RequestInterceptor基本网址没有成功的地方http://192.168.1.64:5050/api/{api_key}.

@Override
public void intercept(RequestFacade request) {
    request.addPathParam("api_key", apiKey);
}
Run Code Online (Sandbox Code Playgroud)

还有其他选择吗?

rest android httprequest retrofit

21
推荐指数
2
解决办法
2万
查看次数

Travis CI for Android

尝试使用Travis CI开始我的Android项目.首先,我使用Android Bootstrap设置虚拟项目,并从square's otto项目中添加了一个yml文件 - 修改为具有我的用户名和repo名称.

我的构建失败,错误" /home/travis/build.sh:line 94:android:command not found,即使square的项目构建正常.

该错误似乎表明路径未正确设置,尽管我的.travis.yml中有这些行

  • export ANDROID_HOME =〜/ builds/f2prateek/FoodBot/android-sdk-linux
  • export PATH = $ {PATH}:$ {ANDROID_HOME}/tools:$ {ANDROID_HOME}/platform-tools

还有什么我需要设置才能做到这一点吗?

android travis-ci

13
推荐指数
1
解决办法
7304
查看次数

在Android 4.3中将位图保存到磁盘/库

我一直在使用系统保存屏幕截图的方式将我的位图保存到磁盘和图库.这适用于Android 4.2及之前,但不适用于Android 4.3.

相关代码:

Uri imageUri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
OutputStream out = resolver.openOutputStream(uri);
Run Code Online (Sandbox Code Playgroud)

完整代码在这里.

但是在4.3(新的Nexus 7)中,我在第二行得到了一个FileNotFoundException.我在网站上看不到与此相关的4.3的任何变化.

那么将图像保存到磁盘和图库的正确方法是什么?

已验证:

  • 使用此方法安装存储
  • imageUri不为null(通常类似于"content:// media/external/images/media/2034")
  • manifest有权限android.permission.WRITE_EXTERNAL_STORAGE

android

7
推荐指数
1
解决办法
2676
查看次数

为什么 Dagger 不允许每个元素有多个限定符注释?

假设我有两个服务AServiceBService,两者都需要 api 密钥。

所以在我的模块中,我不能做类似的事情:

@Provides @Singleton @A @ApiKey String provideAKey() { return "a"; }
@Provides @Singleton @B @ApiKey String provideBKey() { return "b"; }
Run Code Online (Sandbox Code Playgroud)

(Dagger 会抱怨“每个元素只允许有一个限定符注释”)。相反,我要做的是为每个组合定义两个单独的限定符:@ApiKeyA@ApiKeyB

对于具有多个依赖项的服务(例如网络客户端、请求标头等),为每个组合定义这些限定符而不是简单地组合不同的注释会变得很麻烦。

有没有明确禁止这样做的原因?

dagger

4
推荐指数
1
解决办法
1309
查看次数

标签 统计

android ×3

dagger ×1

httprequest ×1

java ×1

kotlin ×1

rest ×1

retrofit ×1

structure ×1

travis-ci ×1

tree ×1