我怎样才能做到这一点:
public class Main extends ListActivity , ControlMenu
Run Code Online (Sandbox Code Playgroud)
此外,我想知道这种方法是可以的,我已经在课程中制作了ControlMenu的菜单,我正在扩展其余的活动.
假设我有两个接口:
public interface I1
{
default String getGreeting() {
return "Good Morning!";
}
}
public interface I2
{
default String getGreeting() {
return "Good Afternoon!";
}
}
Run Code Online (Sandbox Code Playgroud)
如果我想实现它们,将使用什么实现?
public class C1 implements I1, I2
{
public static void main(String[] args)
{
System.out.println(new C1().getGreeting());
}
}
Run Code Online (Sandbox Code Playgroud) 由于Java 8接口可以有默认方法.我知道如何从实现方法中显式调用该方法,即(请参阅在Java中显式调用默认方法)
但是,如何在代理上使用反射显式调用默认方法?
例:
interface ExampleMixin {
String getText();
default void printInfo(){
System.out.println(getText());
}
}
class Example {
public static void main(String... args) throws Exception {
Object target = new Object();
Map<String, BiFunction<Object, Object[], Object>> behavior = new HashMap<>();
ExampleMixin dynamic =
(ExampleMixin) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),new Class[]{ExampleMixin.class}, (Object proxy, Method method, Object[] arguments) -> {
//custom mixin behavior
if(behavior.containsKey(method.getName())) {
return behavior.get(method.getName()).apply(target, arguments);
//default mixin behavior
} else if (method.isDefault()) {
//this block throws java.lang.IllegalAccessException: no …Run Code Online (Sandbox Code Playgroud) Java 8接口默认方法与抽象类中的非抽象方法 - 两者之间是否存在任何差异(除了iface的类别,可见性等)
不是Java中的默认方法,这意味着它违背了Java多年来所宣传的本质?!
在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 public void doSomeWork(){
System.out.println("FOO");
}
}
@FunctionalInterface
interface BFunctionalInterface extends AFunctionalInterface {
@Override
default public void doSomeWork(){
System.out.println("BAR");//Unreachable in same object?
}
}
class AImplementor …Run Code Online (Sandbox Code Playgroud) 在java网站的教程页面上的这个例子中.两个接口定义相同的默认方法startEngine().类FlyingCar实现两个接口,并且必须覆盖,startEngine()因为存在明显的冲突.
public interface OperateCar {
// ...
default public int startEngine(EncryptedKey key) {
// Implementation
}
}
public interface FlyCar {
// ...
default public int startEngine(EncryptedKey key) {
// Implementation
}
}
public class FlyingCar implements OperateCar, FlyCar {
// ...
public int startEngine(EncryptedKey key) {
FlyCar.super.startEngine(key);
OperateCar.super.startEngine(key);
}
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么,from FlyingCar,super用于指代startEngine()in OperateCar和FlyCarinterfaces的两个版本.据我所知,startEngine()没有在任何超类中定义,因此不应该被称为居民.我也没有看到super和实现的两个接口之间有任何关系FlyingCar
在下面的代码中,当我有一个类实现两个具有相同默认方法签名的接口时,它要求我重写它。但在重写方法中为什么我必须使用 super 关键字来调用默认方法。
package practice;
interface interA{
public default void AImp(){
System.out.println("Calling Aimp from interA");
}
}
interface interB{
public default void AImp(){
System.out.println("Calling Aimp from interB");
}
}
public class Practice implements interA,interB {
public static void main(String[] args) {
Practice inter = new Practice();
inter.AImp();
}
@Override
public void AImp() {
interA.super.AImp();
}
}
Run Code Online (Sandbox Code Playgroud)
我可以使用下面的代码执行相同的操作:
@Override
public void AImp() {
interA inter = new Practice();
inter.AImp();
}
Run Code Online (Sandbox Code Playgroud) 我在某些 StackOverflow 答案中看到了术语抽象方法、具体方法 和默认方法的“不同”定义。
Java 语言规范给出的真正定义是什么?请在您的答案中包含相关的支持 JLS 参考。
我正在阅读Java 8中的默认方法,我陷入了一件事 - 有没有办法从接口调用默认方法而不实现它,或者使用动态代理?通过使用一种简单的方法,如下面的方法:
interface DefaultTestInterface{
default void method1(){
//default method
}
}
class ImplementingClass implements DefaultTestInterface{
public void method1(){
//default method invocation in implementing method
DefaultTestInterface.super.method1();
}
void method2(){
//default method invocation in implementing class
DefaultTestInterface.super.method1();
}
}
public class Main {
public static void main(String[] args) {
//is there any way to simply invoke default method without using proxy and reflection?
}
}
Run Code Online (Sandbox Code Playgroud)
我读了类似的问题,但第一个只与实现方法中的调用相关联,另外两个与使用反射和反射的动态代理连接.
那些解决方案非常复杂,我想知道是否有更简单的方法.我也阅读了那些文章,但我找不到解决问题的方法.我将不胜感激任何帮助.