Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.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中的子类引用嵌套类吗?_Java_Kotlin - Fatal编程技术网

可以从Java中的子类引用嵌套类吗?

可以从Java中的子类引用嵌套类吗?,java,kotlin,Java,Kotlin,我正在与一个Java库进行交互,该库具有以下功能: 类超类{ 静态类嵌套{} } 类子类扩展超类{} 这是Kotlin中的非法代码: class Test() { val thing1 = Superclass.Nested() val thing2 = Subclass.Nested() } 编译器说Subclass.Nested是一个未解析的引用。但是,等效Java代码并不非法: 类测试{ Superclass.Nested thing1=新的Superclass.Nes

我正在与一个Java库进行交互,该库具有以下功能:

类超类{
静态类嵌套{}
}
类子类扩展超类{}
这是Kotlin中的非法代码:

class Test() {
    val thing1 = Superclass.Nested()
    val thing2 = Subclass.Nested()
}
编译器说
Subclass.Nested
是一个未解析的引用。但是,等效Java代码并不非法:

类测试{
Superclass.Nested thing1=新的Superclass.Nested();
Subclass.Nested thing2=新的Subclass.Nested();
}
Kotlin中是否有其他方法通过使用子类而不是超类限定嵌套类来引用嵌套类


(为什么?因为这里有一个不寻常的弃用模式:
超类
已弃用,正在被
子类
替换。
嵌套的
类稍后将被移动到
子类
中。这是我工作的外部约束。)

我不确定这是否解决了您的问题,您可以从子类访问嵌套类,因此可以执行以下操作:

open class Superclass {
    class Nested
}

class Subclass : Superclass() {

    companion object Nested {
        operator fun invoke(): Superclass.Nested = Nested()
    }

}

class Test() {
    val thing1 = Superclass.Nested()
    val thing2 = Subclass.Nested()
}
另外,为了避免任何混乱,您可以创建一个创建嵌套类的函数

class Subclass : Superclass() {

    companion object {
        fun createNested() = Nested()
    }

}

由于您无法访问源代码或必须等待PR批准,我可能会尝试使用,例如:

typealias MyNested = Superclass.Nested
然后像这样使用它:

MyNested()
一旦
超类
过时,您只需更换类型别名,例如:

typealias MyNested = Subclass.Nested
这样,当
超类
被删除时,您只有一个地方需要调整代码

现在很遗憾,这两个类都不在您的控制之下,而且Java的这个特性在Kotlin中不起作用。另一方面,我真的很高兴它不是。类似于
Subclass.Nested
的东西,实际上没有任何这样的嵌套类,在我看来并不方便。然而,这也是扩展函数可以实现的。。。所以现在我陷入了冲突;-)


正如评论中所说:这可能只是一个bug。我还没有找到任何来源,无论这是否是一个深思熟虑的设计决定。听起来不错,但这并不意味着这是故意的。您可能希望在or中提出相同的问题,并将其链接到此处。

在第一种情况下,没有理由将
嵌套
作为伴随对象。我认为,您可以添加类型别名
typenested=Superclass.Nested
,使其可用作一个类型。谢谢您的建议。不幸的是,它在我的情况下不起作用<代码>超类
和子类
是用Java编写的库的一部分,不会改变。(很抱歉,我在原始问题中没有明确说明这一点——我会更新它。)我可以对库进行PR以进行兼容性更改,并且它可能会被接受,但我想不出任何更改会使
嵌套的
可以通过
子类
从Kotlin访问<代码>嵌套的
尚未移动(但最终会移动)。我想到的最好的方法是在
子类
的内部子类化
嵌套
,但这太恶心了。@ean5533实际上在
子类
的内部有
嵌套
似乎是我做你想做的事情的唯一干净方法。。。如果你想在将来重构它,那似乎也是正确的方法。。。但是你为什么要马上去做呢?这是一种重构,还是你想保持导入的相似性,或者你的真正目的是什么?我只是想尽快停止使用不推荐的类,而不是等待出现突破性的变化。因为这在本例中是不可能的,所以我们只能等待更改的发生。我很高兴不是所有在Java中工作的东西在Kotlin中都是可能的。当
子类是
超类的静态嵌套类时,使用
子类.Nested()
有什么好处?那么为什么不直接使用
Superclass.Nested()
?我还很高兴从Kotlin实例访问
静态
字段也不起作用;-)也许这与……罗兰我在最后一段解释了我的限制。解释不清楚吗?不,不是……我不安地写了关于重构问题的评论(应该在;-)一分钟后写:我将保留
超类.Nested()
,直到
子类
中新的
嵌套
存在为止。。。只要不是这样,
Superclass
Superclass.Nested
仍然需要。。。虽然有一些方法可以实现类似
Subclass.Nested()
的功能,但这些只是解决方法。。。要么再次需要该嵌套类,要么不。。。模拟它就在那里,因为它在Java中是这样工作的,似乎不是我的最佳借口……我同意继续引用
超类.Nested
暂时是一个可行的选择。我只是想走在曲线的前面,这样当
超类
最终被删除,取而代之的是
子类
时,我们就已经准备好了。因为
嵌套的
超类
的一个重要部分(它被转换为一个静态的内部类),为
子类
模拟它是没有实际意义的。如果
超类
随后被删除,则您的
子类
仍然没有准备好,只要它不包含嵌套的
内部类。此外,您的
子类
超类
的子类,因此基本上您还有工作要做,当
超类
最终被删除时。。。因此,除了
子类
超类
;-)的子类之外,我看不到任何重构问题看起来这是故意不允许的:我说得太快了,那个问题说它应该适用于Java中定义的类,但从来没有任何后续…@ean5533很好!我想知道如何区分Kotlin嵌套类