Tag: default method

Java 8中接口和抽象类之间的根本区别

考虑到接口现在可以为它提供的方法提供实现,我无法正确理解接口和抽象类之间的差异。 有谁知道如何正确解释差异? 我还被告知,与抽象类相比,接口稍微更轻,性能明智。 有人可以证实吗?

为什么Java 8中的Cloneable中没有默认的clone()

Java中的可Cloneable本质上是破碎的。 具体来说,我对界面的最大问题是它需要一种不定义方法本身的方法行为。 因此,如果遍历Cloneable列表,则必须使用reflection来访问其定义的行为。 但是,在Java 8中,我们现在有了默认方法,现在我问为什么Cloneable没有默认的clone()方法。 我理解为什么接口不能默认Object方法 ,但是,这是一个明确的设计决策,因此可以做出exception。 我有点想象弃用Object.clone()并将其内部代码更改为: if(this instanceof Cloneable) { return ((Cloneable) this).clone(); } else { throw new CloneNotSupportedException(); } 继续使用任何魔法使clone()在Cloneable作为默认方法。 这并没有真正解决clone()仍然可以很容易地被错误地实现,但这本身就是另一个讨论。 据我所知,这种变化将完全向后兼容: 当前覆盖clone()但没有实现Cloneable (WHY ?!)的类在技术上仍然可以接受(即使在function上不可能,但这与以前没有什么不同)。 当前覆盖clone()但实现Cloneable的类在其实现上仍将起相同的作用。 当前没有覆盖clone()但是实现了Cloneable (WHY ?!)的类现在将遵循规范,即使它在function上并不完全正确。 使用reflection并引用Object.clone()那些仍然可以在function上工作。 即使它引用了Object.clone() super.clone()在function上仍然是相同的。 更不用说这将解决Cloneable一个巨大问题。 虽然繁琐且仍然容易错误地实现,但它将解决界面的巨大面向对象问题。 我能看到的唯一问题是那些实现Cloneable人没有义务覆盖clone() ,但这与之前没有什么不同。 这已在内部进行过讨论,但从未取得成果吗? 如果是这样,为什么? 如果是因为接口不能默认使用Object方法,那么在这种情况下做出exception是否有意义,因为inheritanceCloneable所有对象都期待clone() ?

在JSP EL中使用接口默认方法时,“在类型上找不到属性”

请考虑以下界面: public interface I { default String getProperty() { return “…”; } } 和刚刚重用默认实现的实现类: public final class C implements I { // empty } 每当在JSP EL脚本上下文中使用C的实例时: ${c.property} – 我收到一个PropertyNotFoundException : javax.el.PropertyNotFoundException: Property ‘property’ not found on type com.example.C javax.el.BeanELResolver$BeanProperties.get(BeanELResolver.java:268) javax.el.BeanELResolver$BeanProperties.access$300(BeanELResolver.java:221) javax.el.BeanELResolver.property(BeanELResolver.java:355) javax.el.BeanELResolver.getValue(BeanELResolver.java:95) org.apache.jasper.el.JasperELResolver.getValue(JasperELResolver.java:110) org.apache.el.parser.AstValue.getValue(AstValue.java:169) org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:184) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:943) org.apache.jsp.index_jsp._jspService(index_jsp.java:225) org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) javax.servlet.http.HttpServlet.service(HttpServlet.java:729) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340) javax.servlet.http.HttpServlet.service(HttpServlet.java:729) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 我最初的想法Tomcat […]

Java 8向类添加扩展/默认方法

我正在寻找一个等同于C#扩展方法function的java。 现在我一直在阅读Java 8的默认方法,但据我所知,我只能将它们添加到接口…… …是否有任何语言function允许我为没有实现接口的最终类​​编写扩展方法? (我宁愿不用包装……)

Java 8默认方法与抽象类中的非抽象方法

Java 8接口默认方法与抽象类中的非抽象方法 – 两者之间是否存在任何差异(除了iface的差异 – 类,可见性等) 不是Java中的默认方法,这意味着它违背了Java多年来所宣传的本质?!

Java 8接口默认方法似乎没有声明属性

在我的应用程序中,我遇到一个问题,当类中的getter仅在接口中默认(Java 8特性)时,结果没有Java Beans属性。 即普通方法调用它只是作为标准方法工作,但对于通过“属性”访问它突然表现不同…… 这是一个测试用例: import java.beans.Introspector; import java.util.Arrays; import java.util.stream.Collectors; import org.apache.commons.beanutils.PropertyUtils; public class test { public static void main (String[] arguments) throws Exception { // Normal language-level invocation, works fine. System.out.println (new Bean1 ().getFoo ()); System.out.println (new Bean2 ().getFoo ()); // Printing Java Beans properties; Bean2 doesn’t have ‘foo’ property… System.out.println (Arrays.stream (Introspector.getBeanInfo […]

超类方法和接口默认方法冲突解决

考虑下面的例子, public class Testing extends SupCls implements Intf { public static void main(String[] args) { new Testing().test(); } } class SupCls { public void test() { System.out.println(“From SupCls”); } } interface Intf { public default void test() { System.out.println(“From Intf”); } } 如您所见, SupCls类和Intf接口之间没有任何关联。 但两者都定义了一种常用方法。 而Testing类正在扩展SupCls并实现Intf 。 所以,当我在Testing输出上调用test()方法时, From SupCls 我认为这是有道理的,因为从类扩展应该比从接口实现更高的优先级。 但是eclipse报告不然,如下面的屏幕截图所示。 我坚信这是Eclipse中的一个错误 。 但在假设之前,是否在JLS中定义并记录了此行为? […]

你可以从子接口那个接口的接口调用父接口的默认方法吗?

在java 8中我有这样的东西: package test; public class SimpleFuncInterfaceTest { public static void carryOutWork(AFunctionalInterface sfi){ sfi.doWork(); } public static void main(String[] args) { carryOutWork(() -> System.out.println(“Do work in lambda exp impl…”)); AImplementor implementsA = new AImplementor(); //carryOutWork(() -> implementsA.doWork()); BImplementor implementsB = new BImplementor(); carryOutWork(() -> implementsB.doWork()); } } @FunctionalInterface interface AFunctionalInterface { public void doWork(); default […]