Java中的通用转换

时间:2015-08-25 12:35:09

标签: java

我有一个设计问题

我得到了一个输入:

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

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

更清楚:

我从数据库获取一个列表,如下所示list= {"java.lang.String", 'java.lang.Integer"}

我得到String数据&#34; 123&#34;。我想验证数据是list.get(1)的实例。我的列表和数据值是动态的,可以更改。

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

假设您有类似List<Object>的内容,为什么不将其转换为具有原始列表中每种类型的列表的类,例如。

class HeapsOfLists {

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

只需将所有实例排序到相应的列表中,甚至可以在新的java流中按类进行一个很好的小组,或者instanceof等。 但那只是我的2点。在其他编程语言中,您有参数匹配,它是为这类事物(某种程度)而构建的。当你在同一个系列中有不同的类型然后需要问每个人时,它永远不会变得非常有利,嘿你到底是什么意思!?!?!?

您将始终需要为新类型添加新代码,这就是为什么有接口来阻止此问题。虽然这是出于某种目的!(并不是说java是一种糟糕的语言)。这样jvm可以更快地运行并更好地优化代码!

我总是喜欢将java视为一种更接近计算机硬件的语言层,但不要像python或其他东西那样远!这样你仍然可以编写非常快的代码!

答案 2 :(得分:0)

我们假设一个方法boolean isValueOfType(String value, String className)

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

如果没有像Marko上面建议的那样适用于每个类的代码,我认为没有任何方法可以实现此检查。

您可以通过尝试将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"));
    }
}

以上可能过度,但基本上是类型和适当的转换器方法的查找表。

如果你不能使用Java 8(lambdas),那么可以使用普通接口实现类似的东西。