问题标签 [default-method]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 接口:使用默认方法超越抽象类的优势(只是一个讨论)
随着 Java 8 的正式发布,每个开发者,尤其是 Java 极客,都对 Lambda 表达式产生了浓厚的兴趣。他们有理由兴奋,因为 scala 和 clojure 已经对 JVM 的开发产生了巨大的影响。现在为了支持 Lambda 表达式,Java 推出了另一个支持功能,称为接口的默认方法。由于我不是Java专家,因此请让我接受技术错误。AFAIK 抽象类提供了类似的功能。所以我们是否开始接受我们已经剥夺了抽象类的主要优势的事实。
期待评论,这将使我清楚抽象仍然具有优于默认方法接口的方面的优势。
pS 我知道抽象类可以保持对象的状态。它可以有构造函数和成员变量。
java - 有没有办法将默认构造函数添加到接口
现在 Java 8 添加了默认方法,有什么方法可以创建默认构造函数吗?
我试过了:
<identifier> expected
从 Netbeans获取错误
为什么需要?我正在使用 Gson 序列化对象并得到“无法调用无参数构造函数..”错误,我知道我可以使用 Gson 的InstanceCreator解决这个问题。但是有没有办法创建一个默认的构造函数?
更新
我发现我自己的代码有问题。我正在使用
代替
因此,即使子类具有默认构造函数,反序列化代码也是不正确的。但是默认构造函数的问题仍然存在。
java - Java 8 中接口和抽象类的根本区别
考虑到接口现在可以为它提供的方法提供实现,我无法正确地合理化接口和抽象类之间的区别。有谁知道如何正确解释差异?
我还被告知,与抽象类相比,接口在性能方面更轻量级。有人可以证实这一点吗?
java - 是否可以调用超接口的默认方法?
假设我有两个课程,A
并且B
:
实例化B
as后b
,就可以调用B
like 的方法了b.method()
。我也可以B
用. 但是如果是一个接口呢:A
super.method()
A
有什么办法可以让B
' 方法调用A
' 的方法?
java - 子接口是默认方法冲突的解决方案吗?
考虑下面的代码,它是一个实际用例的提取,其中LinkedList<E>
实现了List<E>
和Deque<E>
。
可以观察到两个接口都有一个size()
和一个isEmpty()
方法,其中isEmpty()
方法可以默认为size()
.
所以,让我们这样做(使用虚拟接口),因为 Java 8 还没有这样做:
哎呀!我们得到一个编译时错误LinkedList
,因为它不知道isEmpty()
要使用哪个实现,所以我们添加这个:
现在,对于这个用例,我们几乎失去了默认方法的所有好处,因为编写该isEmpty()
方法仍然需要像以前一样多的代码。
但是能解决吗?是的!
考虑以下实现:
所以问题:
- 这是我们以及 JDK 在未来实现中应该如何处理它的方式吗?
java - 何时初始化具有默认方法的接口?
在一个类被初始化之前,它的直接超类必须被初始化,但该类实现的接口没有被初始化。类似地,接口的超接口在接口初始化之前不会被初始化。
出于自己的好奇,我试了一下,果然,界面InterfaceType
没有初始化。
该程序打印
但是,如果接口声明了一个default
方法,那么就会发生初始化。考虑InterfaceType
给出的接口为
然后上面的相同程序将打印
换句话说,static
接口的字段被初始化(详细初始化过程中的步骤 9),并且被static
初始化的类型的初始化器被执行。这意味着接口已初始化。
我在 JLS 中找不到任何东西表明这应该发生。不要误会我的意思,我知道这应该发生在实现类不提供该方法的实现的情况下,但如果提供了怎么办?Java 语言规范中是否缺少此条件,是我遗漏了什么,还是我错误地解释了它?
java - 为什么 Java 8 接口方法中不允许使用“final”?
Java 8 最有用的特性之一是default
接口上的新方法。引入它们的原因基本上有两个(可能还有其他原因):
- 提供实际的默认实现。例子:
Iterator.remove()
- 允许 JDK API 进化。例子:
Iterable.forEach()
从 API 设计者的角度来看,我希望能够在接口方法上使用其他修饰符,例如final
. 这在添加便捷方法时很有用,可以防止实现类中的“意外”覆盖:
Sender
如果是一个类,以上已经是常见的做法:
现在,default
andfinal
显然是矛盾的关键字,但 default 关键字本身并不是严格要求的,所以我假设这种矛盾是故意的,以反映“带主体的类方法”(只是方法)和“接口”之间的细微差别带有主体的方法”(默认方法),即我尚未理解的差异。
在某些时候,还没有完全探索对接口方法等修饰符的支持,static
引用Brian Goetz的话:final
另一部分是我们将在接口中支持类构建工具的程度,例如最终方法,私有方法,受保护方法,静态方法等。答案是:我们还不知道
自 2011 年底以来,显然static
增加了对接口方法的支持。显然,这为 JDK 库本身增加了很多价值,例如Comparator.comparing()
.
问题:
是什么原因final
(也是static final
)从未进入 Java 8 接口?
java - Java 8 接口方法中不允许“同步”的原因是什么?
在 Java 8 中,我可以轻松编写:
我将获得我也可以在类中使用的完整同步语义。但是,我不能synchronized
在方法声明中使用修饰符:
现在,人们可以争辩说,这两个接口的行为方式相同,只是在 on和 on 上Interface2
建立了一个合同,这比什么强一点。当然,我们也可能会争辩说,实现不应该对具体的实现状态做出任何假设,或者这样的关键字根本不会发挥作用。method1()
method2()
Interface1
default
问题:
JSR-335 专家组决定不支持synchronized
接口方法的原因是什么?
java - java默认方法不起作用
我最近升级到 java,我正在尝试使用新的默认接口方法。但是,我不断收到令牌“默认”的语法错误,请删除此令牌。这是我预计会出现问题的构建路径:
我怀疑它与我的构建路径有关,但不知道是什么。如果它与我的代码有关,这是我正在尝试的代码:
有人有什么想法吗?
java - Java8:为什么禁止为 java.lang.Object 中的方法定义默认方法
默认方法是我们 Java 工具箱中一个不错的新工具。但是,我尝试编写一个定义default
该方法版本的接口toString
。Java 告诉我这是被禁止的,因为声明的方法java.lang.Object
可能不会被default
编辑。为什么会这样?
我知道有“基类总是获胜”的规则,所以默认情况下(双关语;),任何方法default
的实现Object
都会被方法覆盖Object
。Object
但是,我认为规范中的方法不应该有例外。特别是对于toString
拥有默认实现可能非常有用。
那么,Java 设计者决定不允许default
方法覆盖来自的方法的原因是什么Object
?