- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
描述
我有一个奇怪的问题 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 {}
}
输出是
java.util.List
没有任何通用类型信息。这对我来说似乎很奇怪。
A
对
public
的可见性它正确地给出了
java.util.List<java.lang.String>
// javac
javac 15.0.1
// java
openjdk version "15.0.1" 2020-10-20
OpenJDK Runtime Environment AdoptOpenJDK (build 15.0.1+9)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 15.0.1+9, mixed mode, sharing)
friend 也可以复制它:
A
之间唯一的可见性组合和
B
触发此问题的是
B
是
public
和
A
是
不是
public
.任何其他组合,它都会再次按预期工作。所以只有
public
, 一个 protected
public
, 一个 package-visible
public
, 一个 private
static
到处都是,没有任何改变。
public Type getGenericReturnType() {
if (getGenericSignature() != null) {
return getGenericInfo().getReturnType();
} else { return getReturnType();}
}
在哪里
getGenericSignature()
依赖于
String signature
在
Method
的构建过程中设置实例。看来是
null
由于某种原因在上述情况下。
B.class
中找到了它。 :
public Test$B();
descriptor: ()V
flags: (0x0001) ACC_PUBLIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #1 // Method Test$A."<init>":()V
4: return
LineNumberTable:
line 16: 0
public java.util.List foo();
descriptor: ()Ljava/util/List;
flags: (0x1041) ACC_PUBLIC, ACC_BRIDGE, ACC_SYNTHETIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #7 // Method Test$A.foo:()Ljava/util/List;
4: areturn
LineNumberTable:
line 16: 0
对我来说,这看起来像
B
,由于某种原因,创建了另一个方法
foo()
这只是将方法调用转发到
A
小号
foo()
因此没有通用类型信息。
B.getDeclaredMethods()
它实际上返回一个方法,即
public java.util.List Test$B.foo()
即使此方法应该排除继承的方法(来自
documentation ):
Returns an array containing Method objects reflecting all the declared methods of the class or interface represented by this Class object, including public, protected, default (package) access, and private methods, but excluding inherited methods.
B
现在是有意义的真的创建了一个包装方法。
最佳答案
让我们在这里慢慢来。首先,here is why首先生成一个桥接方法。即使你放弃了泛型,仍然会有一个桥接方法。也就是说,这段代码:
static class A {
public String foo() { return null; }
}
public static class B extends A {}
仍会生成
foo
使用
ACC_PUBLIC, ACC_BRIDGE, ACC_SYNTHETIC
的方法.您可以阅读错误描述并了解为什么需要这样做。
A
public
,不会生成这样的方法,原因应该很明显,考虑到前面的bug解释(我希望)。所以这个想法是,如果你有一个非公共(public)类(class),
javac
将为上述场景生成一个桥接方法。
interface WithGeneric<T> {
public WithGeneric<T> self(T s);
}
public class Impl implements WithGeneric<String> {
@Override
public WithGeneric<String> self(String s) {
return null;
}
}
Impl.class
中也会产生桥接方法,但它的声明将是接口(interface)的删除。换句话说,
Impl.class
中会有两种方法。 :
public WithGeneric<String> self(String) {...}
public WithGeneric self(Object) {...}
关于java - 反射 - Method::get Generic Return Type no generic - 可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65613220/
generic parameters of trait function 的简单示例: trait Ext: Sized { fn then(self, f: fn(Self) -> R) -
在下面的代码中,为什么 Groovy 似乎忽略了方法 barMany 中提供的闭包参数的泛型类型声明: import groovy.transform.CompileStatic @CompileSt
据我所知,Prolog 没有任何内置机制用于generic programming。 .可以使用统一来模拟泛型,但这需要在运行时进行类型检查: :- initialization(main). :-
在我的应用程序中,我有一个 Board。董事会由细胞组成。每个单元格都有一个 int 值。有几种类型的 Board 可以扩展 Board。每种类型的板将以不同方式表示单元格。例如,一个人会使用 Lis
我想将存储的属性添加到 UIView 子类中,例如UIView、UIImageView、UIPickerView等, 我只需要从子类创建 UIView 的实例子类仅类型不同,所有属性和方法都相同。 T
这个问题在这里已经有了答案: Any type and implementing generic list in go programming language (2 个答案) 关闭 6 个月前。
我有以下代码as seen in ideone.com : import java.util.*; class Test{ interface Visitor{ public
在 Swift 中,我们可以对序列等通用项编写扩展: extension Sequence where Iterator.Element : ObservableType { } 这将保证扩展仅适用于
我知道这听起来很困惑,但这是我能解释的最好的了。 (您可以建议一个更好的标题)。我有 3 节课:- A public class A > { ... } B public class B {
我目前在大学攻读 CS,我刚刚开始学习数据结构和算法类(class)。我的教授非常喜欢(实际上是强制我们)使用 Ada。为了取得成功,我开始查找一些东西并找到了这段代码,它描述了如何编写通用堆栈: g
我正在玩 Scala By Example 开头的 QuickSort 示例并尝试将其调整为通用类型 A ,而不仅仅是 Int s。 到目前为止我的工作是 def sort[A new Y(i, -
谁能解释为什么下面的第二个例子不能编译? “测试 2”给出“错误 FS0670:此代码不够通用。类型变量 ^a 无法泛化,因为它会超出其范围。”。我无法理解此错误消息。 // Test 1 type
如何将泛型存储在非泛型对象持有的泛型TList中? type TXmlBuilder = class type TXmlAttribute= class Name: Str
我正在尝试通过遵循 wiki article 创建如何使用 GHC.Generics 的最小工作示例.这是我所拥有的: {-# LANGUAGE DefaultSignatures, DeriveGe
我正在尝试将 get 函数添加到 wiki 中描述的通用序列化中。 。有些部分看起来很简单,但有一些地方我非常不确定要写什么,毫不奇怪,我遇到了编译错误。我已经查看了原始论文以及 cereal 中的实
为什么这段代码有效? $v):void { print_r($v); } test(Vector {1, array("I'm an array"), 3}); 它不应该抛出错误吗?什么是应
有没有办法让 Rust Generic 只接受原始类型?我想稍后迭代值中的位,并且我知道这只有在原始类型中才有可能。 struct MyStruct { my_property: T // m
假设我有一个简单的类 public class MyObject { } 以及处理MyObject子类的handler接口(interface) public interface MyObjectHa
出于某种原因,我正在努力通过使用通用基类来实现通用接口(interface)的属性,如下所示: public interface IParent where TChild : IChild {
我收到以下错误。 google了一天多,还是找不到具体的解决方法,求大神指点,谢谢 ERROR: Cannot implicitly convert type System.Collections.G
我是一名优秀的程序员,十分优秀!