gpt4 book ai didi

Java 泛型——寻找一种方法来告诉我泛型类型的父类(super class)型

转载 作者:行者123 更新时间:2023-11-30 07:12:30 25 4
gpt4 key购买 nike

的父类(super class)型
SomeClass <Double>  

Someclass <T extends Numbers>

不是

SomeClass <Numbers> 

我正在寻找一种返回泛型类实例父类(super class)型的方法。就像是ClassgetGenericSuperclass()(虽然不能完全一样——getGenericSuperclass() 仅返回一个类,而泛型可以扩展并受多个类限制,如:

例如:

Someclass <T extends aConcreteClass && anInterface && anotherInterface>

当我在泛型类的实例上运行 getGenericSuperclass() 时,我得到了 Object 作为返回。

在 Java 中有没有这样的方法,告诉我实例化对象的泛型类型的父类(super class)型?

//===================

编辑:对下面@jwa 的回答的冗长评论:

我知道泛型是在编译时进行类型检查的。然而,JVM 仍然可以在运行时绑定(bind)类型,尽可能具体使用 type inference 的结果,并至少返回父类(super class)型的定义而不是仅仅返回 Object 作为父类(super class)型。此信息清晰可用在运行时。但我认为它没有这样做。

注意:还没有深入研究类型删除。

//=================================

编辑2:

引用术语“有界类型参数”在 this页,我一直在寻找一种方法来返回对象的“绑定(bind)类”,

在例子中是Comparable

public class Node<T extends Comparable<T>> {

private T data;
private Node<T> next;

public Node(T data, Node<T> next) {
this.data = data;
this.next = next;
}

public T getData() { return data; }
// ...
}

在同一个page .

在那些页面或其他任何地方都没有它的踪迹——我猜 Java 没有这样做。

最佳答案

你需要看看“类型删除”。本质上,当您的 Java 代码被编译成字节码时,通用信息会丢失(或“删除”)。这就是为什么您找不到任何通过反射类查询泛型类型的方法。

我在 SO 上找不到关于类型删除的好答案,但 Wikiepdia 似乎有一个 reasonable description .

值得注意的是,选择类​​型删除是为了在 Java 1.5 和 1.4 之间提供向后兼容性。其他语言对此有不同的实现。例如,.NET 完全支持字节码中的泛型 - 并且允许将此类方法作为其反射 API 的一部分。


考虑这个类,它使用类型化和非类型化列表:

import java.util.List;

public class CastExample <T extends Object> {
public List<T> typedList;
public List<?> untypedList;

public T getFirstElement() {
return typedList.get(0);
}


public T getFromUntypedArray() {
return (T) untypedList.get(0);
}
}

这两种方法在字节码中的编码方式没有区别。我们可以使用 javap 看到这一点,特别是 javap -c CastExample:

/var/tmp-> javap -c CastExample

Compiled from "CastExample.java"
public class CastExample<T> {
public java.util.List<T> typedList;

public java.util.List<?> untypedList;

public CastExample();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return

public T getFirstElement();
Code:
0: aload_0
1: getfield #2 // Field typedList:Ljava/util/List;
4: iconst_0
5: invokeinterface #3, 2 // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
10: areturn

public T getFromUntypedArray();
Code:
0: aload_0
1: getfield #4 // Field untypedList:Ljava/util/List;
4: iconst_0
5: invokeinterface #3, 2 // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
10: areturn
}

这些操作中每一个的确切含义都不是特别重要。重要的是它调用了完全相同的操作,两者之间没有区别。

关于Java 泛型——寻找一种方法来告诉我泛型类型的父类(super class)型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20294295/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com