Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带有泛型的Kotlin异步API定义_Java_Android_Kotlin - Fatal编程技术网

Java 带有泛型的Kotlin异步API定义

Java 带有泛型的Kotlin异步API定义,java,android,kotlin,Java,Android,Kotlin,我将用Java Android编写的框架迁移到Kotlin,以支持跨平台趋势。 我对科特林来说是个新手,一路上我都搞不清楚所有的细节 我所面临的问题是将现有的Java接口重写为Kotlin,并能够包含in/out变量,以便能够轻松地传递不同的泛型子类 现有Java API如下所示: /** * Channels API * * @author Veljko Ilkic */ public interface ChannelsAPI<T extends TvChannel, C ex

我将用Java Android编写的框架迁移到Kotlin,以支持跨平台趋势。 我对科特林来说是个新手,一路上我都搞不清楚所有的细节

我所面临的问题是将现有的Java接口重写为Kotlin,并能够包含in/out变量,以便能够轻松地传递不同的泛型子类

现有Java API如下所示:

/**
 * Channels API
 *
 * @author Veljko Ilkic
 */
public interface ChannelsAPI<T extends TvChannel, C extends EntityCategory> {

    /**
     * Get channel list
     *
     * @param callback
     */
    void getChannelList(AsyncDataReceiver<ArrayList<T>> callback);
/**
*通道API
*
*@作者Veljko Ilkic
*/
公共接口信道SAPI{
/**
*获取频道列表
*
*@param回调
*/
void getChannelList(AsyncDataReceiver回调);
第一阶段转移到Kotlin的是:

/**
 * Channels API
 *
 * @author Veljko Ilkic
 */
interface ChannelsInAPI<T : TvChannel<*>?, C : EntityCategory?> {

    /**
     * Get channel list
     *
     * @param callback
     */
    fun getChannelList(callback: AsyncDataReceiver<List<T>?>?)
/**
*通道API
*
*@作者Veljko Ilkic
*/
接口通道API{
/**
*获取频道列表
*
*@param回调
*/
有趣的getChannelList(回调:AsyncDataReceiver?)
现在,我希望避免在使用此框架的客户端应用程序中明确定义所有泛型类型。我的理解是,当我使用in/out泛型时,编译器可以在运行时像在Java中一样确定自己的泛型类型

目前我正面临这个问题:

/**
 * Channels API
 *
 * @author Veljko Ilkic
 */
interface ChannelsOutAPI<in T : TvChannel<*>?, C : EntityCategory?> {

    /**
     * Get channel list
     *
     * @param callback
     */
    fun getChannelList(callback: AsyncDataReceiver<List<T>?>?)
/**
*通道API
*
*@作者Veljko Ilkic
*/
接口通道soutapi{
/**
*获取频道列表
*
*@param回调
*/
有趣的getChannelList(回调:AsyncDataReceiver?)
类型参数T声明为“in”,但出现在类型AsyncDataReceiver中的“invariant”位置?

我不确定我是否正确地解释了这个问题。 但我的想法是将我现有的API分成更小的部分,并带有in和out参数,并且能够减少显式类型定义

我所有的API都是异步调用,并且通过这个回调类重新调用数据,这个回调类也接受泛型

/**
 * Async receiver interface
 *
 *
 * Used for async events callback
 *
 * @author Veljko Ilkic
 */
interface AsyncDataReceiver<T> {

    /**
     * On data receive success
     */
    fun onReceive(data: T)

    /**
     * On data receive failed
     *
     * @param error error
     */
    fun onFailed(error: Error?)
}
/**
*异步接收器接口
*
*
*用于异步事件回调
*
*@作者Veljko Ilkic
*/
接口异步数据接收器{
/**
*数据接收成功
*/
接收(数据:T)
/**
*数据接收失败
*
*@param错误
*/
操作失败(错误:错误?)
}
更新:

/**
 * Async receiver interface
 *
 *
 * Used for async events callback
 *
 * @author Veljko Ilkic
 */
interface AsyncDataReceiver<**in** T> {

    /**
     * On data receive success
     */
    fun onReceive(data: T)

    /**
     * On data receive failed
     *
     * @param error error
     */
    fun onFailed(error: Error?)
}
/**
*异步接收器接口
*
*
*用于异步事件回调
*
*@作者Veljko Ilkic
*/
接口异步数据接收器{
/**
*数据接收成功
*/
接收(数据:T)
/**
*数据接收失败
*
*@param错误
*/
操作失败(错误:错误?)
}

这修复了错误,但从逻辑角度来看,AsyncDataReceiver应该有OUT参数,但它将其用作IN参数。

之所以会出现错误,是因为通过将类型定义为
IN
或invariant,您明确表示该类将只使用T类型,但返回(或生成)了破坏该规则的类型T的列表我理解错误,但无法找到解决方法,使其具有与Java中类似的行为。在AsyncDataReceiver中,我将T状态为in参数,这修复了错误。但在这种情况下,存在逻辑错误。AsyncDataReceiver基本上生成T泛型,但它被标记为in。您有没有o在中将其标记为
?它可以只是泛型吗?目前它只是泛型的,工作正常。问题是代码变得非常难看,因为我没有几个泛型抽象级别。在这种情况下,API用户需要定义泛型类型的整个堆栈。我有抽象TvChannel,它也接受很少的泛型类型,这所以只接受很少的泛型类型。客户端应用程序非常混乱,因为Kotlin强迫我在层次结构中指定每个泛型类型。我的理解是,in/out有助于避免这个问题,我可以将超类型作为泛型和viceversea传递。对吗?AsyncDataDetriever是一个T使用者,所以它在逻辑上应该是
中的
sn不是Java的原始类型的直接等价物,但原始类型无论如何都不安全。您可以根据需要使用星形投影和强制转换来做同样的事情。