(JAVA)这段代码为什么可以强制转换为String类型?

顺应天意了却凡尘 发布于 02/16 18:01
阅读 647
收藏 2

@tcxu 你好,想跟你请教个问题:

代码如下:

package qi;

/**
 *@ClassName : SystemInfo
 *
 *@Description:打印当前虚拟机的所有环境属性的变量和值
 *
 *@date :2014年4月4日下午6:26:03
 */
import java.util.Enumeration;
import java.util.Properties;

public class SystemInfo {
    public static void main(String[] args) {
        Properties sp = System.getProperties();// 获得当前虚拟机的环境属性
        Enumeration e = sp.propertyNames();// 获得环境属性中所有的变量
        // 循环打印出当前虚拟机的所有环境属性的变量和值
        while (e.hasMoreElements()) {
            String key = (String) e.nextElement();
            // Properties的getProperty(String key):用指定的键在此属性列表中搜索属性,返回值是String类型的
            System.out.println(key + " = " + sp.getProperty(key));
        }
    }
}
划红线处为什么可以强制转换为String类型?

加载中
0
覃盛春

因为key本来就是String,只是为了其他目的包装成其他类了吧,这种代码你可以不问为什么,一般是实现的人提供使用示例。实现的人这么设计代码了,你去问为什么是这样用还不如为什么这么设计。

0
tcxu
tcxu

    已知:Java System 类 的 成员方法 static Properties getProperties() 用来确定当前的系统属性。故从代码知:实体 sp, 是当前虚拟机 JVM (环境)属性。

    属性是用字符串 String 类表示。比如,属性类 class Properties 的成员方法  String getProperty(String key) 就是用指定的字符串键在此属性列表中搜索属性(的值)。
    属性的成员方法  Enumeration<?> propertyNames() 的功能是:返回属性列表中所有键的枚举,如果在主属性列表中未找到同名的键,则包括默认属性列表中不同的键。所以 执行代码:"Enumeration e = sp.propertyNames();" 就创建了一个枚举类的实体 e, 它保存了 属性列表中的所有的键。而每一个键,是用给定的一个字符串来表示的。

    枚举类的方法  E nextElement() 的功能是:"如果此枚举对象至少还有一个可提供的元素,则返回此枚举的下一个元素"。 每次通过引用 e 调用方法  nextElement(), 即 "e.nextElement()", 将返回一个枚举类实体的元素,即属性列表中的一个键,一个用字符串表示的键。当然,可以用"强制转换的方式" 显示,这个键的名字是以字符串形式显示出来的。    

顺便解释下一行的部分代码代码:  sp.getProperty(key)。这是按照一个给定的键,返回(查询)对应属性的值。

木九天
木九天
你这百度的可牛了
0
李泡芙
因为知道内容是String
0
S海风S
S海风S

感觉都没说到重点。能转是因为 这个定义Enumeration e,相当于 Enumeration<Object> e,这样e.next()是Object类型的,当然能转String

0
小象鸭
小象鸭
找了一下,发现这个包内有用到类似的功能 具体代码如下
package com.sun.org.apache.xalan.internal.xsltc.trax
private Properties createOutputProperties(Properties outputProperties) {
    final Properties defaults = new Properties();
    setDefaults(defaults, "xml");

    // Copy propeties set in stylesheet to base
    final Properties base = new Properties(defaults);
    if (outputProperties != null) {
        final Enumeration names = outputProperties.propertyNames();
        while (names.hasMoreElements()) {
            final String name = (String) names.nextElement();
            base.setProperty(name, outputProperties.getProperty(name));
        }
    }
    else {
        base.setProperty(OutputKeys.ENCODING, _translet._encoding);
        if (_translet._method != null)
            base.setProperty(OutputKeys.METHOD, _translet._method);
    }

    // Update defaults based on output method
    final String method = base.getProperty(OutputKeys.METHOD);
    if (method != null) {
        if (method.equals("html")) {
            setDefaults(defaults,"html");
        }
        else if (method.equals("text")) {
            setDefaults(defaults,"text");
        }
    }

    return base;
}
然后继续往下追踪,我们可以看到Enumeration<E> 这个类里面的  E nextElement();返回泛型是一个Object 固然可以转成String
public interface Enumeration<E> {
    /**
     * Tests if this enumeration contains more elements.
     *
     * @return  <code>true</code> if and only if this enumeration object
     *           contains at least one more element to provide;
     *          <code>false</code> otherwise.
     */
    boolean hasMoreElements();

    /**
     * Returns the next element of this enumeration if this enumeration
     * object has at least one more element to provide.
     *
     * @return     the next element of this enumeration.
     * @exception  NoSuchElementException  if no more elements exist.
     */
    E nextElement();
}
0
木九天
木九天

中国和山东,一个范围广,一个范围具体一点,

同样String相当于山东更加具体准确,而你取出来的结果是个范围广的信息,虽然也对,但是我们能用更具体的就用更具体的,也就是转换String

返回顶部
顶部