【问题标题】:How to cast String to the generic information that it represents?如何将 String 转换为它所代表的通用信息?
【发布时间】:2019-12-03 08:13:07
【问题描述】:

我的目标是转换为泛型类型,即 String 包含的信息,即不同 Java 类型之间的信息变量。例如:

String s = "10";
E e1 = (E)s;
String s = "abc";
E e2 = (E)s;

在本例中,e1 将是一个整数,而 e2 仍然是字符串。几个小时以来我一直在寻找解决方案,我发现最好的是solution with reflection

但是,如果它包含其他类型的信息,它会单独转换为字符串,从而导致代码的其他部分出现故障。

【问题讨论】:

  • A String 只是每个字符串。您只能将其转换为StringObjectString 实现的接口之一。如果要将其转换为Integer,则需要使用方法或构造函数,例如new Integer(s)
  • 泛型不是这样工作的。泛型几乎 单独是一个编译时类型检查系统(加上运行时的一点点转换)。并且 String 不能转换为 int,它必须被解析
  • @ErwinBolwidt 不要使用 Integer 构造函数,因为它在较新的 Java 版本中已被弃用。请改用valueOf
  • 我认为这实际上是一个有趣的想法,但是您对此有何期待:“仅 10 欧元”?如果您在某处 (EUR) 有一些 Enum of that kind,您可以拥有它的字符串、一个数字 (10)、2 个字符串(“EUR”、“only”)和一个 ISO 货币代码。所以不可能自动解码。
  • @gurioso 我使用的字符串代表每个字符串的一种数据类型。如果给定这种情况,则 String 的不同“类型”之前是分开的

标签: java casting


【解决方案1】:

在您的“通用”概念(例如“€10.-”的第二和第三个字符可能代表的信息类型)和 generic types(这是一个 Java 技术术语和概念)之间存在一些术语冲突。

下面有一些东西,String 类的对象是兼容的。只有Comparable 被认为是Java 技术意义上的泛型类型(这里它有类型参数<String>),其余的都不是。

public final class String implements java.io.Serializable, 
Comparable<String>, CharSequence, Constable, ConstantDesc

您不需要将字符串强制转换为其中任何一个。你可以这样做:

String s = "10";
CharSequence c = s;

如果你反过来,你有CharSequence c,那么你可以找出它是否真的是字符串,如果是,那么你可以转换。顺便提一句。还有 "reflection approach" 你在投射之前提到的测试 (clazz.isAssignableFrom)。

CharSequence c = new StringBuffer("Käse");
if(c instanceOf String) // it is not, it is instanceOf StringBuffer
{
   String anotherString = (String) c;
}

您所说的不是转换,而是转换或评估。您可以使用 Integer 的转换方法valueOf() 从 String 中获取 Integer。

   Integer two = Integer.valueOf("2");

但它可能会失败,例如如果你试试这个Integer.valueOf("€10.-"),你会得到一个NumberFormatException。您只需要选择数字部分才能使其工作Integer.valueOf("€10.-".substring(1, 3))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    • 2021-07-26
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 2022-08-04
    相关资源
    最近更新 更多