Java语言中怎么在一个类里蕴含不同类型的属性,属性的个数可以不断添加,但是不许用Object

Java语言中怎么在一个类里蕴含不同类型的属性,属性的个数可以不断添加,类型也可以是任意的,但是不许用Object,因为那样类型就转换不过来了。怎么实现?

你是不是报这个错了

img

看下我的修改 :

img


效果如图:

img

代码:

import java.util.HashMap;
import java.util.Map;

public class DynamicAttributes<T> {
    private Map<String, T> attributes;

    public DynamicAttributes() {
        attributes = new HashMap<>();
    }

    // 添加属性和属性值
    public void addAttribute(String attributeName, T value) {
        attributes.put(attributeName, value);
    }

    // 获取属性值
    public T getValue(String attributeName) {
        return attributes.get(attributeName);
    }

    public static void main(String[] args) {
        DynamicAttributes<Object> objAttributes = new DynamicAttributes<>();

        objAttributes.addAttribute("name", "若城");
        objAttributes.addAttribute("age", 25);
        objAttributes.addAttribute("salary", 999999000.0);

        // String name = objAttributes.getValue("name");
        String name = (String) objAttributes.getValue("name");

        System.out.println("姓名: " + name);

        int age = (int) objAttributes.getValue("age");
        System.out.println("年龄: " + age);

        double salary = (double) objAttributes.getValue("salary");
        System.out.println("工资: " + salary);
    }
}


1.是谁告诉你Object转不过来的,Object是所有类型的基类,你能放进去就能转回来
2.你也可以自己写个基类,其他类型继承它

如果你需要在一个类中包含不同类型的属性,并且允许属性的个数可以不断添加,并且不使用Object类型,你可以考虑使用泛型和集合类来实现。

一种常见的做法是使用Map集合来存储属性和属性值的对应关系。Map集合可以支持不同类型的值,并且可以动态添加和获取属性。

下面是一个示例代码,展示了如何使用Map集合来实现该需求:

import java.util.HashMap;
import java.util.Map;

public class Attributes {
    private Map<String, Object> attributes = new HashMap<>();
    
    public <T> void setAttribute(String name, T value) {
        attributes.put(name, value);
    }
    
    public <T> T getAttribute(String name) {
        return (T) attributes.get(name);
    }
    
    public static void main(String[] args) {
        Attributes attrs = new Attributes();
        
        attrs.setAttribute("name", "John");
        attrs.setAttribute("age", 25);
        
        String name = attrs.getAttribute("name");
        Integer age = attrs.getAttribute("age");
        
        System.out.println("Name: " + name);
        System.out.println("Age: " + age);
    }
}

在以上示例中,通过setAttribute方法可以将属性名和对应的属性值添加到Map集合中。通过getAttribute方法可以根据属性名获取属性值,并使用泛型进行类型转换。

需要注意的是,由于使用了泛型,需要在使用时确保属性值与属性类型的匹配,否则可能会引发类型转换异常。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/740722
  • 这篇博客你也可以参考下:Java List<Object>取出Object中某个属性转成对应的List<String>,List<int>,和拼接成字符串
  • 同时,你还可以查看手册:java-学习Java语言 - 描述Java编程语言的基本概念和特点的课程。-接口和继承描述了接口--它们是什么,为什么你想写一个,以及如何写一个。本节还描述了从一个类派生出另一个类的方法。也就是说,一个子类如何从超类中继承字段和方法。你将了解到所有的类都是从Object类派生出来的,以及如何修改一个子类从超类继承的方法。-继承性 中的内容
  • 除此之外, 这篇博客: java - 求和中的 算术运算符中求和运算: 对于数字的求和计算我们通常使用计算器,但是对于特别复杂的数进行求和计算机是无法满足我们的,那么除了计算器还有什么方法呢? 当然有了,没有一个算法是一个程序搞定不了的。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    计算分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个数列的前 20 项之和

    结果演示
    在这里插入图片描述
    代码演示

    package com.zsh;
    
    import java.util.Scanner;
    
    public class qiuhe {
    	public static Scanner input = new Scanner(System.in);
    	public static void main(String[] args){
    		int x = 2, y = 1;
    		double sum = 0;
    		for(int i=0;i<=20;i++){
    			sum = sum + (double)x/y;
    			x = x ^ y;
    			y = x ^ y;
    			x = x ^ y;
    			x = x + y;
    		}
    		System.out.println("前二十项相加之和为:"+sum);
    	}
    
    }
    
    

    深入Java,逻辑练习,获取更多关注我哟!!!

  • 您还可以看一下 黄桂钊老师的Java架构师基本功之源码第一课课程中的 为什么大厂都爱考源码解读?小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    解决方案:

    根据问题描述,我可以给出一个实现该需求的解决方案。以下是具体步骤:

    1. 创建一个类,例如"DynamicProperties",该类可以包含各种不同类型的属性。

    2. 在"DynamicProperties"类中,使用存储不同属性的数据结构,例如HashMap或LinkedHashMap。

    3. 创建一个方法,例如"addProperty",用于动态添加属性。该方法应该接受两个参数:属性名称和属性值。在方法内部,将属性名称作为键,属性值作为值,存储到数据结构中。

    4. 创建一个方法,例如"getProperty",用于获取属性。该方法应该接受一个参数:属性名称,并返回对应的属性值。在方法内部,根据属性名称从数据结构中获取对应的属性值,并返回。

    5. 在"DynamicProperties"类中,根据实际需要,可以添加其他方法,例如"removeProperty"用于删除属性,"getAllProperties"用于获取所有属性等。

    6. 在代码中使用"DynamicProperties"类添加、获取、删除属性,并进行相应的测试。

    以下是一个示例代码:

    import java.util.HashMap;
    import java.util.Map;
    
    public class DynamicProperties {
        private Map<String, Object> properties;
    
        public DynamicProperties() {
            properties = new HashMap<>();
        }
    
        public void addProperty(String name, Object value) {
            properties.put(name, value);
        }
    
        public Object getProperty(String name) {
            return properties.get(name);
        }
    
        public void removeProperty(String name) {
            properties.remove(name);
        }
    
        public Map<String, Object> getAllProperties() {
            return properties;
        }
    
        public static void main(String[] args) {
            DynamicProperties dynamicProperties = new DynamicProperties();
    
            // 添加属性
            dynamicProperties.addProperty("name", "John");
            dynamicProperties.addProperty("age", 25);
            dynamicProperties.addProperty("isStudent", true);
    
            // 获取属性
            String name = (String) dynamicProperties.getProperty("name");
            int age = (int) dynamicProperties.getProperty("age");
            boolean isStudent = (boolean) dynamicProperties.getProperty("isStudent");
    
            System.out.println("name: " + name);
            System.out.println("age: " + age);
            System.out.println("isStudent: " + isStudent);
    
            // 删除属性
            dynamicProperties.removeProperty("age");
    
            // 获取所有属性
            Map<String, Object> allProperties = dynamicProperties.getAllProperties();
            System.out.println("allProperties: " + allProperties);
        }
    }
    

    请注意,由于该类可以包含各种不同类型的属性,因此在使用getProperty时,需要进行正确的强制类型转换。另外,对于不同类型的属性,可以根据实际需要进行相应的处理。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^