【问题标题】:Is there a way to check what variable type is used using generics? [duplicate]有没有办法检查使用泛型使用的变量类型? [复制]
【发布时间】:2017-11-08 17:48:32
【问题描述】:

以这个伪代码为例:

public static<T> int findNumber(T xNumber, double a, int b){
    if (xNumber == int) {
        // do something... return some number...
    } else {
        return null; 
    }

有没有办法在实际运行的 Java 代码中表达这一点?

【问题讨论】:

  • instanceof ... o.getClass() == Integer.getClass() .. 只是为了让您理解:int 是一个原语,所以它不起作用。
  • 如果你需要检查泛型对象的类型,说明我们的设计有问题。
  • 同意@user902383。如果您需要对 T 泛型定义进行更多控制,请考虑在您的方法定义中添加 &lt;T extends ...&gt; 等限制
  • 您可能根本不需要泛型,将 T 替换为 Number

标签: java variables generics


【解决方案1】:

您无法使用 Java 代码表达这种特定情况。

你可以找an answer here了解原因。

但是,如果您希望对整数使用泛型,Integer Java 类支持泛型。它还实现了本机 int 使用的每个基本操作 (+ - * / %)。在您的示例中,您可以使用:

if (xNumber instanceof Integer)

偶数

if (xNumber.getClass() == Integer.getClass())

正如@Stultuske 在 cmets 中所建议的那样。


编辑:关于你的班级设计的评论也很真实。您可能需要重新设计您的代码,这样您就不必检查泛型对象的类型(尤其是因为您正在检查单个类类型)。

【讨论】:

  • Integer.class(复制错误);和of = 荷兰语为or ;)
  • ...我没听懂。
  • aNumber.getClass() == Integer.class
  • 1个月后,我明白了,谢谢!
【解决方案2】:

Number 类几乎是隐藏的存在,但非常有用。

public static <T extends Number> int findNumber(...)
    ... xNumber.intValue() // longValue(), doubleValue()
    if (xNumber instanceof Integer) ...

因为类型擦除更多是不可行的。

【讨论】:

    猜你喜欢
    • 2022-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    • 2022-06-16
    • 2022-01-03
    相关资源
    最近更新 更多