在Collection接口中,我find了一个名为removeIf()的方法,它包含了它的实现。 default boolean removeIf(Predicate<? super E> filter) { Objects.requireNonNull(filter); boolean removed = false; final Iterator<E> each = iterator(); while (each.hasNext()) { if (filter.test(each.next())) { each.remove(); removed = true; } } return removed; } 我想知道是否有任何方法在界面中定义方法体? 什么是default关键字,它是如何工作的?
Java接口中的方法应该使用还是不使用public访问修饰符来声明? 从技术上讲,这当然没有关系。 实现interface类方法始终是public 。 但是什么是更好的约定? Java本身并不一致。 请参阅Collection vs. Comparable或Future vs. ScriptEngine 。
可能重复: 结构体实现接口是否安全? 拿这个代码: interface ISomeInterface { public int SomeProperty { get; } } struct SomeStruct : ISomeInterface { int someValue; public int SomeProperty { get { return someValue; } } public SomeStruct(int value) { someValue = value; } } 然后我做这个地方: ISomeInterface someVariable = new SomeStruct(2); 在这种情况下盒装SomeStruct ?
我有一个UDP套接字绑定到INADDR_ANY侦听我的服务器上的所有IP数据包。 我通过相同的套接字发送回复。 现在服务器自动select使用哪个IP作为发送数据包时的源IP,但我希望能够自己设置输出源IP。 有没有办法做到这一点,而不必为每个IP创build一个单独的套接字?
我有一个像这样的通用接口: interface A<T> { T getValue(); } 这个接口具有有限的实例,因此最好将它们作为枚举值来实现。 问题是那些实例有不同types的值,所以我尝试了下面的方法,但它不能编译: public enum B implements A { A1<String> { @Override public String getValue() { return "value"; } }, A2<Integer> { @Override public Integer getValue() { return 0; } }; } 任何想法呢?
有没有可行的方法使用generics创build一个math库,不依赖于select存储数据的基本types? 换句话说,我们假设我想写一个Fraction类。 这个分数可以用两个或两个双打或者什么来表示。 重要的是基本的四个算术运算是明确的。 所以,我希望能够写入Fraction<int> frac = new Fraction<int>(1,2)和/或Fraction<double> frac = new Fraction<double>(0.1, 1.0) 。 不幸的是,没有界面代表四个基本操作(+, – ,*,/)。 有没有人find一个可行,可行的方式来实现这一点?
我今天使用Eclipse的“拉接口”重构function来创build基于现有类的接口。 提供的对话框用于创build新接口的所有新方法为“抽象”方法。 那会有什么好处呢? 我认为你被允许将接口方法声明为抽象的事实是这个语言的一个多余和无害的特征,并不是特别鼓励的。 为什么Eclipse会支持这种风格,或者为什么有人会自愿select这样做呢? 澄清:我不是问为什么接口方法是抽象的,这是显而易见的。 我在问为什么要明确地select把它们标记为抽象的,因为如果它们在一个接口中,它们是抽象的。
默认的方法在我们的Java工具箱中是一个很好的新工具。 但是,我试图编写一个接口来定义toString方法的default版本。 Java告诉我这是被禁止的,因为在java.lang.Object声明的方法可能不是default 。 这是为什么? 我知道有“基类总是赢”的规则,所以在默认情况下(双关语), Object方法的任何default实现将被来自Object的方法覆盖。 但是,我没有看到为什么在规范中不应该有Object方法的exception。 特别是对于toString ,有一个默认的实现可能是非常有用的。 那么,Javadevise者为什么决定不允许default方法从Object覆盖方法的原因是什么呢?
接口中的C#方法是在不使用virtual关键字的情况下声明的,并且在派生类中override而不使用override关键字。 这是有原因吗? 我认为这只是一种语言方便,显然CLR知道如何处理这个问题(方法在默认情况下不是虚拟的),但是还有其他的技术原因吗? 这是派生类生成的IL: class Example : IDisposable { public void Dispose() { } } .method public hidebysig newslot virtual final instance void Dispose() cil managed { // Code size 2 (0x2) .maxstack 8 IL_0000: nop IL_0001: ret } // end of method Example::Dispose 请注意,该方法在IL中被声明为virtual final 。
我注意到,如果在一个接口中指定一个参数为可选参数,那么使用C#4中的可选参数,您不必在任何实现类上使该参数为可选参数: public interface MyInterface { void TestMethod(bool flag=false); } public class MyClass : MyInterface { public void TestMethod(bool flag) { Console.WriteLine(flag); } } 因此: var obj = new MyClass(); obj.TestMethod(); // compiler error var obj2 = new MyClass() as MyInterface; obj2.TestMethod(); // prints false 有谁知道为什么可选参数devise为这样工作? 一方面,我认为能够重写在接口上指定的任何默认值是有用的,不过说实话,我不确定是否应该甚至能够在接口上指定默认值,因为这应该是实现的决定。 另一方面,这种断开意味着你不能总是交替地使用具体的类和接口。 这当然,如果在实现中指定了默认值,那么这个问题就不会成为问题,但是如果你将具体类作为接口公开(使用一些IOC框架来注入具体类),那么真的没有作为调用者必须始终提供默认值的点。