标签: java-bridge-method

实现只包含一个接口的两种方法

我创建了界面TwoMethods.源代码:

interface TwoMethods<T>
{
    public void method(T t);
}
Run Code Online (Sandbox Code Playgroud)

然后我创建了实现这个接口的类,在反汇编后我看到了2个方法.类:

class A implements TwoMethods<A>
{
    @Override
    public void method(A a) {}
}
Run Code Online (Sandbox Code Playgroud)

拆解后:

class A implements TwoMethods<A> {
   A();
   public void method(A); //first
   public void method(java.lang.Object); //second
}
Run Code Online (Sandbox Code Playgroud)

同样适用于Comparable界面.为什么当我创建参数化接口时,我有两种方法.总是,当我使用参数时?我还有另外的方法Object作为参数?

java generics interface type-erasure java-bridge-method

16
推荐指数
2
解决办法
848
查看次数

使用不同Java版本的Strange Default Method行为

假设我有以下类层次结构:

interface Collection<E>
{
    Collection<E> $plus(E element)
}

interface MutableCollection<E> extends Collection<E>
{
    @Override
    MutableCollection<E> $plus(E element)
}

interface Set<E> extends Collection<E>
{
    @Override
    Set<E> $plus(E element)
}

interface MutableSet<E> extends Set<E>, MutableCollection<E>
{
    @Override
    default MutableSet<E> $plus(E element)
    {
        // ... implementation
    }
}

abstract class AbstractArraySet<E> implements Set<E>
{
    // ... no $plus(...) implementation
}

class ArraySet<E> extends AbstractArraySet<E> implements MutableSet<E>
{
    // ... no $plus(...) implementation
}
Run Code Online (Sandbox Code Playgroud)

如您所见,只有MutableSet该类提供了该$plus方法的实现.在测试用例中,我在类型的实例上调用此方法ArraySet.测试总是在CI环境中传递,而它总是AbstractMethodError在我的本地环境中失败.在这两种情况下,我都在使用Gradle(2.7).


错误: …

java interface abstract-methods java-bridge-method default-method

10
推荐指数
1
解决办法
293
查看次数

为什么Java声称在涉及有界泛型时有2个声明的方法?

具有以下定义:

public interface BaseService<T, ID> {

    T findOne(ID id);

}

public class BaseServiceImpl<T,ID extends Serializable> implements BaseService<T, ID> {

    @Override
    public T findOne(ID id) {
        return null;
    }

}
Run Code Online (Sandbox Code Playgroud)

为什么BaseServiceImpl.class.getDeclaredMethods()返回2种方法:

  • public java.lang.Object BaseServiceImpl.findOne(java.io.Serializable)
  • public java.lang.Object BaseServiceImpl.findOne(java.lang.Object)

有没有办法过滤掉这些?

java generics reflection java-bridge-method

7
推荐指数
1
解决办法
120
查看次数

反射 - Method::getGenericReturnType 没有泛型 - 可见性

描述

我有一个奇怪的问题,其中Method::getGenericReturnType()无法检索通用类型信息。

这是最小化版本:

public class Test {
    public static void main(String[] args) {
        Method method = B.class.getMethods()[0]; // foo() method inherited from A
        System.out.println(method.getGenericReturnType());
    }

    static class A {
        public List<String> foo() { return null; }
    }

    public static class B extends A {}
}
Run Code Online (Sandbox Code Playgroud)

输出是

java.util.List
Run Code Online (Sandbox Code Playgroud)

没有任何通用类型信息。这对我来说似乎很奇怪。

但是,将As 的可见性更改为public并正确地给出

java.util.List<java.lang.String>
Run Code Online (Sandbox Code Playgroud)

我不知道这是错误还是实际预期的行为。如果是预期的,其背后的原因是什么?

我正在使用来自 AdoptOpenJDK 的 OpenJDK 15:

// javac
javac 15.0.1

// java
openjdk version "15.0.1" 2020-10-20
OpenJDK Runtime Environment AdoptOpenJDK (build 15.0.1+9) …
Run Code Online (Sandbox Code Playgroud)

java generics reflection javac java-bridge-method

7
推荐指数
1
解决办法
191
查看次数

用Java编写Synthetic / Bridge方法

我正在编写一个应用程序,用于检查该方法是顺数还是桥接。为了测试该应用程序,我在存根中添加了各种方法。但是对于任何一种方法,该块都不会包含在测试用例中。存根包含诸如validate(Object o)等方法,其方法与其他任何普通的Java类一样。

我应该在存根中添加哪种方法,以便覆盖该行?

代码:

     Method[] methods = inputClass.getMethods();
        for (Method method : methods) {

        if (method.isSynthetic() || method.isBridge()) {
            isInternal = true;
        }
       // More code.
     }
Run Code Online (Sandbox Code Playgroud)

java reflection stubbing java-bridge-method

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

为什么 Java 编译器会为包私有超类型中定义的公共方法添加可见性桥接方法?

我想知道为什么Java编译器会在foo这里为该方法添加桥接方法:

public class Outer {

  class SuperClass {
    public void foo() { }
  }

  public class SubClass extends SuperClass { }
}
Run Code Online (Sandbox Code Playgroud)

foo方法被编译为publicSuperClass类型。然而,该SubClass方法将方法重新定义为通向相同方法的桥梁。我想知道为什么需要这座桥。

java javac java-bridge-method

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