小编Lor*_*igs的帖子

JLS完全重新定义方法是否覆盖和泛型?

所以,我正在尝试编写一个方法来回答我之前的一个问题:如何判断一个任意的java.lang.Method是否会覆盖另一个?为此,我正在阅读JLS,并且在一个案例中似乎缺少一些部分.

想象一下,您有以下课程:

public class A<T> {
    public void foo(T param){};
}

public class B extends A<String> {
    public void foo(String param){};
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,很明显是B.foo覆盖A.foo,但我不明白这种情况如何符合规范.

关于方法覆盖,JLS§8.4.8.1规定:

在类C中声明的实例方法m1将覆盖在类A中声明的另一个实例方法m2,如果以下所有条件都为真:

  1. C是A的子类.

  2. m1的签名是m2签名的子签名(§8.4.2).

  3. 或者:

    • m2在与C相同的包中是公共的,受保护的或声明的,具有默认访问权限
    • m1覆盖方法m3(m3与m1不同,m3与m2不同),使得m3覆盖m2.

显然,在我们的案例中,第1点和第3点是满意的.让我们在JLS中看一下子签名意味着什么.该JLS§8.4.2说:

如果两个方法具有相同的名称和参数类型,则它们具有相同的签名.

如果满足以下所有条件,则两个方法或构造函数声明M和N具有相同的参数类型:

  1. 它们具有相同数量的形式参数(可能为零)

  2. 它们具有相同数量的类型参数(可能为零)

  3. 设A1,...,An为M的类型参数,让B1,...,Bn为N的类型参数.将N的类型中每次出现的Bi重命名为Ai后,相应类型变量的界限为同样,M和N的形式参数类型是相同的.

在我们的例子中,第1点显然是正确的(都有1个参数).

第2点有点混乱(这就是我不确定规范究竟意味着什么):两种方法都没有声明它们自己的类型参数,而是A.foo使用T哪种类型变量来对类进行参数化.

所以我的第一个问题是:在这个上下文中,是否在类计数中声明类型变量?

好的,现在让我们假设T不计算,因此第2点是假的(我不知道在这种情况下我怎么能应用第3点).我们的两种方法没有相同的签名,但这并不妨碍B.foo成为其子签名A.foo.

JLS§8.4.2中稍微进一步说:

方法m1的签名是方法m2的签名的子签名,如果:

  1. m2与m1具有相同的签名,或

  2. m1的签名与m2签名的擦除(§4.6)相同.

我们已经确定第1点是错误的.

根据JLS§4.6的方法的擦除签名是a signature consisting of the same name …

java generics jls

5
推荐指数
1
解决办法
190
查看次数

ExtJS是否自动垃圾收集组件

想象一下以下情况,我有以下HTML文档:

<html>
    <head>... include all the js and css here...</head>
    <body>
        <div class="placeholderForExtPanel"></div>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

现在在我的代码中,我告诉ExtJS在我的占位符中渲染一个面板.

var container = Ext.select('.placeholderForExtPanel');
Ext.create('Ext.form.Panel', {
    title: 'My Panel'
});
Run Code Online (Sandbox Code Playgroud)

稍后,代码的其他部分决定从DOM中删除占位符div.

Ext.select('.placeholderForExtPanel').first().remove();
Run Code Online (Sandbox Code Playgroud)

在这种情况下,小组之前发生了什么?我是否需要手动销毁它,或者ExtJS是否知道它包含的元素刚刚从DOM中删除它应该自行销毁Panel?我正在使用ExtJS 4.1.

javascript garbage-collection extjs

5
推荐指数
1
解决办法
1177
查看次数

RabbitMQ:在没有使用者连接时丢弃消息

我正在尝试在一个只有一个生产者和一个使用者的模型中设置RabbitMQ,并且只有当使用者连接时,生产者发送的消息才传递给使用者,而如果消费者不存在则将其丢弃。

基本上,我希望队列在没有使用者连接时丢弃所有收到的消息。

另一个约束是,该队列必须在RabbitMQ服务器端声明,并且不能由使用者或生产者显式创建。

那可能吗?

我看了几件事,但似乎无法使它起作用:

  1. 持久与非持久不起作用,因为它仅在代理重新启动时才有用。我需要相同的效果,但在连接上。
  2. auto_delete在队列上设置为true意味着我的客户端永远无法再连接到该队列。
  3. x-message-ttl并且max-length即使有消费者连接,也可能丢失消息。
  4. 我已经看过主题交换,但是据我所知,它们仅影响基于消息内容的交换和队列之间的消息路由,无法考虑队列是否已连接使用者。

我正在寻找的效果将类似于auto_delete断开连接和auto_create连接。Rabbitmq中是否有一种机制可以让我做到这一点?

amqp rabbitmq

5
推荐指数
1
解决办法
3710
查看次数

错误TS2306:“ ... index.d.ts”不是模块

我正在尝试在Typescript中编写一个lib,我想在其他各种Typescript或JS项目中使用它。所有其他项目都在浏览器中运行。

我的Typescript lib项目有多个文件,每个文件都是一个具有1个类和1-2个接口的React组件(对于熟悉React的组件,则为Component + Props + State)。

我希望我的组件库可以被其他项目作为AMD模块导入,并且我希望所有已编译的JS代码都捆绑在一个文件中,作为该库构建过程的一部分。

到目前为止,我已经成功设置了所有内容,以便我的lib可以编译。我使用以下选项设置了编译器:jsx: "react", declaration: true, module: "amd"

lib生成的代码如下所示:

define("epb-widget/WidgetItemNav", ["require", "exports", "react"], function (require, exports, React) {
    "use strict";
    exports.WidgetItemNav = ...;
});
define("epb-widget/WidgetItemInfo", ["require", "exports", "react"], function (require, exports, React) {
    "use strict";
    exports.WidgetItemInfo = ...;
});
define("epb-widget/WidgetItem", ["require", "exports", "react", "epb-widget/WidgetItemNav", "epb-widget/WidgetItemInfo"], function (require, exports, React, WidgetItemNav_1, WidgetItemInfo_1) {
    "use strict";
    exports.WidgetItem = ...;
});
define("epb-widget/WidgetOptions", ["require", "exports", "react"], function (require, exports, React) {
    "use strict";
    exports.WidgetOptions = ...;
}); …
Run Code Online (Sandbox Code Playgroud)

amd typescript typescript-typings

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