返回不同类型的Java函数

时间:2018-06-08 17:25:02

标签: java

我正在尝试执行getTag函数,我想将TagName传递给返回类型。我的老师告诉我,在C中我们可以通过引用传递并使用第一个参数相同而另一个返回类型创建多个函数,我想做类似的事情。

我将最后一个索引保存在txt文件中,类似于:

Nome ; Ricardo ; String
Horas Jogo ; 1700 ; String
Frutas ; Bananas ; String
Horas ; 1700 ; Int

例如:

int n; 
n = ob.getTag("Horas", n); 

并且有类似的内容:

public String getTag(String name, String info) {
    System.out.println("getTag - Nome da Tag: " + name);
    Tag aux;
    int i = 0;
    do {
        aux = Tags.get(i);
        i++;
    } while (!aux.TagName.equals(name) && i < Tags.size());
    if (aux.TagName.equals(name)) {
        if (aux.TagInfoTipo.equals("String")) {
            return aux.TagInfo;
        } else if (!aux.TagInfoTipo.equals("String")) 
            return null;//add throw exception

    }


public int getTag(String name, int info) {
    System.out.println("getTag - Nome da Tag: " + name);
    Tag aux;
    int i = 0;
    do {
        aux = Tags.get(i);
        i++;
    } while (!aux.TagName.equals(name) && i < Tags.size());
    if (aux.TagName.equals(name)) {
        if (aux.TagInfoTipo.equals("Int")) {
            value = Integer.valueOf(aux.TagInfo);
            return value;
        } else if (!aux.TagInfoTipo.equals("Int")) {
            return null;//add throw exception
        }

我只是不知道这是否可以在Java中使用,所以在这个例子中n最终会得到一个值为1700的int。

2 个答案:

答案 0 :(得分:0)

对于Java8,您可以使用lambdas:

按名称查找代码实例

private static final Function<String, Tag> GET_TAG_BY_NAME = name -> {
    for (int i = 0, size = Tags.size(); i < size; i++) {
        Tag tag = Tags.get(i);

        if (tag != null && tag.TagName.equals(name))
            return tag;
    }

    return null;
};

定义如何提取所需类型:

public static final Function<Tag, String> STRING = tag -> tag != null && "String".equals(tag.TagInfoTipo) ? tag.TagInfo : null;
public static final Function<Tag, Integer> INTEGER = tag -> tag != null && "Int".equals(tag.TagInfoTipo) ? Integer.valueOf(tag.TagInfo) : null;

getTag()方法(适用于所有可能的返回类型):

public <T> T getTag(String name, Function<Tag, T> checkType) throws Exception {
    return Optional.ofNullable(GET_TAG_BY_NAME.andThen(checkType).apply(name))
                   .orElseThrow(() -> new Exception("Tag name '" + name + "' was not found"));
}

客户代码:

String strTag = getTag("name", STRING);
Integer intTag = getTag("name", INTEGER);

答案 1 :(得分:0)

C没有&#34;通过引用调用&#34; (与C ++相反,C ++通过引用进行 true 调用)。在C中,通常使用void*指针来模拟类似的东西,但这通常不是一个好习惯。

从问题中的描述来看,手头的任务似乎没什么特别之处:只需实施必要的方法......

float getTag(..., float t) { ... }
int   getTag(..., int   t) { ... }
long  getTag(..., long  t) { ... }

它们将是C语言和Java语言中的单独方法。 (尽管从技术上讲,你可以提取一些nasty tricks并推动任何一种语言的限制......)

但是,您描述的任务偶尔出现,并且根据您发布的代码,可能总结如下:

您想要一个可以一般存储不同类型对象的地方,并通过为其提供名称和一些类型信息来检索对象。

有一些可能的解决方案,它们可以在Java中以类型安全和简洁的方式实现:您可以将期望的类型传递给方法,并确保返回的对象与此类型匹配。 / p>

这还包括通过自动拆箱将Integer对象转换为基元int的情况。但是,在这种情况下必须要小心,以避免NullPointerException

这是一个完整的示例,显示了这种&#34;类型安全存储的非常基本结构&#34;。当然,这可以任意扩展,但应足以说明问题:

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Objects;

public class GenericTypeSafeStorage
{
    public static void main(String[] args)
    {
        Container container = new Container();

        container.put("Nome", "Ricardo");
        container.put("Horas Jogl", "1700");
        container.put("Frutas", "Bananas");
        container.put("Horas", 1700);

        String nome = container.get("Nome", String.class);
        System.out.println("Nome: " + nome);

        // This could throw an exception, but here, just returns null:
        Integer nomeInteger = container.get("Nome", Integer.class);
        System.out.println("Nome as integer: " + nomeInteger);

        int horas = container.get("Horas", Integer.class);
        System.out.println("horas: " + horas);

        try
        {
            // Careful: This returns an Integer that is null, and trying
            // to convert it into an "int" will cause an exception!
            int frutasAsInt = container.get("Frutas", Integer.class);
        }
        catch (NullPointerException expected)
        {
            System.out.println("Expected");
        }

    }
}

class Container
{
    private final Map<String, Object> elements;

    Container()
    {
        this.elements = new LinkedHashMap<>();
    }

    public void put(String name, Object element)
    {
        Objects.requireNonNull(name, "The name may not be null");
        Objects.requireNonNull(element, "The element may not be null");
        elements.put(name, element);
    }

    public <T> T get(String name, Class<? extends T> type) 
    {
        Objects.requireNonNull(type, "The type may not be null");
        Object element = elements.get(name);
        if (element == null)
        {
            return null;
        }
        Class<?> actualType = element.getClass();
        if (type.isAssignableFrom(actualType))
        {
            return type.cast(element);
        }
        return null; // Or throw something:
        //throw new IllegalArgumentException(
        //    "There is no element with name " + name + " and type " + type);
    }
}