相关疑难解决方法(0)

从两个类扩展

我怎样才能做到这一点:

public class Main extends ListActivity , ControlMenu 
Run Code Online (Sandbox Code Playgroud)

此外,我想知道这种方法是可以的,我已经在课程中制作了ControlMenu的菜单,我正在扩展其余的活动.

java android

142
推荐指数
8
解决办法
44万
查看次数

在Java 8中使用两个具有相同签名的默认方法实现两个接口

假设我有两个接口:

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 interface java-8

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

如何从动态代理显式调用默认方法?

由于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 reflection java-8 default-method

27
推荐指数
3
解决办法
3439
查看次数

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

Java 8接口默认方法与抽象类中的非抽象方法 - 两者之间是否存在任何差异(除了iface的类别,可见性等)

不是Java中的默认方法,这意味着它违背了Java多年来所宣传的本质?!

java abstract-class java-8 default-method

12
推荐指数
1
解决办法
5267
查看次数

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

在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 java-8 default-method functional-interface

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

在这个Java示例中对"super"关键字感到困惑

在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 OperateCarFlyCarinterfaces的两个版本.据我所知,startEngine()没有在任何超类中定义,因此不应该被称为居民.我也没有看到super和实现的两个接口之间有任何关系FlyingCar

java interface super java-8 default-method

6
推荐指数
2
解决办法
1543
查看次数

为什么我们需要 super 关键字来调用默认接口方法?

在下面的代码中,当我有一个类实现两个具有相同默认方法签名的接口时,它要求我重写它。但在重写方法中为什么我必须使用 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)

java oop interface super

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

JLS 如何指定术语“抽象方法”、“具体方法”和“默认方法”?

我在某些 StackOverflow 答案中看到了术语抽象方法具体方法默认方法的“不同”定义。

Java 语言规范给出的真正定义是什么?请在您的答案中包含相关的支持 JLS 参考。

java default abstract jls

5
推荐指数
2
解决办法
225
查看次数

如何在没有反射和动态代理的情况下简单地显式调用默认方法?

我正在阅读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)

我读了类似的问题,但第一个只与实现方法中的调用相关联,另外两个与使用反射反射的动态代理连接.

那些解决方案非常复杂,我想知道是否有更简单的方法.我也阅读了那些文章,但我找不到解决问题的方法.我将不胜感激任何帮助.

java methods default java-8

3
推荐指数
1
解决办法
208
查看次数