有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java中的泛型转换

我想我有个设计问题

我得到一个输入:

  • 列表:List<String>类型,例如"java.lang.string"
  • 数据字符串

我想动态验证数据是否为list.get(i)类型

更清楚地说:

我从数据库中得到如下列表list= {"java.lang.String", 'java.lang.Integer"}

我得到一个String数据“123”。我想验证数据是否是list.get(1)的实例。我的列表和数据值是动态的,可以更改


共 (3) 个答案

  1. # 1 楼答案

    我们应该假设一种方法boolean isValueOfType(String value, String className)

    • assertTrue(isValueOfType("123", "java.lang.Integer"))
    • assertFalse(isValueOfType("ABC", "java.lang.Integer"))

    如果没有马尔科建议的每个类都使用的代码,我看不到任何实现这种检查的方法

    您可以通过一个函数映射合理地实现它,这些函数尝试将value转换为以下类型:

    import java.util.HashMap;
    import java.util.Map;
    import java.util.function.Function;
    
    public class Converters {
        private final Map<String, Function<String, Boolean>> converters;
    
        Converters() {
            converters = new HashMap<>();
            converters.put("java.lang.String", (v) -> true);
            converters.put("java.lang.Integer", (v) -> {
                try {
                    Integer.valueOf(v);
                    return true;
                }
                catch (NumberFormatException e) {
                    return false;
                }
            });
        }
    
        public boolean isValueOfType(String value, String className) {
            Function<String, Boolean> converter = converters.get(className);
            return converter.apply(value);
        }
    }
    

    还有一个单元测试

    import org.junit.Assert;
    import org.junit.Test;
    
    public class ConvertersTest {
        @Test
        public void testInteger() {
            Converters converters = new Converters();
            Assert.assertTrue(converters.isValueOfType("123", "java.lang.Integer"));
            Assert.assertFalse(converters.isValueOfType("ABC", "java.lang.Integer"));
        }
    
        @Test
        public void testString() {
            Converters converters = new Converters();
            Assert.assertTrue(converters.isValueOfType("123", "java.lang.String"));
            Assert.assertTrue(converters.isValueOfType("ABC", "java.lang.String"));
        }
    }
    

    以上内容可能有些过头,但基本上是一个类型和适当转换器方法的查找表

    如果不能使用Java8(lambdas),那么可以通过普通接口实现类似的功能

  2. # 2 楼答案

    在运行时,列表不是List<String>类型,它仅在静态类型计算级别可见,并且属于表达式的静态类型,而不是实例的动态类型

    在运行时,该列表属于实现List(例如,ArrayList)的某种类型,它只包含一种或另一种类型的对象。类型可以是任何类型

    因此,使支票通用的方法必须基于反思。您必须通过Class.forName(String)检索该类,然后使用Class.isInstance(Object)检查对象是否属于该类型

  3. # 3 楼答案

    假设你有List<Object>之类的东西,为什么不把它转换成一个类,在原始列表中为每种类型都有一个列表,例如

    class HeapsOfLists {
    
     List<String> strings;
     List<Float> floats;
     List<Double> doubles;//.. ect
    }
    

    只需将所有实例排序到相应的列表中,就可以在新的java流中按类进行分组,或者instanceof等等。。 但那只是我的20美分。在其他编程语言中,有参数匹配,这是为这类事情而构建的。如果你在同一个系列中有不同的款式,然后需要问每个人,嘿,你到底是什么?这永远都不会是一件很容易的事

    您总是需要为新类型添加新代码,这就是为什么有接口来阻止这个问题。这是有目的的!(并不是说java是一种糟糕的语言)。这是为了让jvm运行得更快,更好地优化代码

    我总是喜欢把java看作是一种更接近计算机硬件的语言之上的一层,但不太像python之类的东西!这样,你仍然可以写代码,这是非常快的