Как мне сделать функцию Java, которая принимает переменные любого типа? - PullRequest
0 голосов
/ 15 мая 2018

Я хотел бы создать функцию, которая может принимать любую входящую переменную независимо от ее типа (int, double, String или других объектов), а затем, возможно, определять тип переменной и действовать условно на типа.

Как я могу это сделать?

Ответы [ 4 ]

0 голосов

Перегрузка является наиболее рекомендуемой опцией, в большинстве случаев вам не нужна функция, которая принимает переменные любого типа.

Но как насчет функции, которая принимает любые Object?Возможно, вам придется использовать instanceof и обрабатывать их в зависимости от типа данных.

Использование instanceof: [Name of object instance] instanceof [Name of object type to match]

instanceof возвращает boolean: trueтогда и только тогда, когда тип экземпляра объекта соответствует типу для сопоставления.

Один пример функции или метода, который принимает «любой тип переменной»:

public static void method(Object obj) {
    if (obj instanceof String)
        System.out.println("I am a String!");

    if (obj instanceof Integer)
        System.out.println("I am an Integer!");

    // Similarly for other types of Object
    if (obj instanceof ... )
        ...

    // The .getClass() is for any Object
    System.out.println(obj.getClass());
}

Обратите внимание, что создание функциине допускающий использование переменных любого типа.

0 голосов
/ 15 мая 2018

В зависимости от того, хотите ли вы отличить штучные значения от атомарных или нет, у вас есть следующие опции, все из которых представлены в тесте ниже:

  1. используйте Object: вы потеряете атомарные типы, так как они будут упакованы
  2. используйте дженерики: вы потеряете атомарные типы, поскольку они будут упакованы
  3. используйте любой из вышеперечисленных вместе с перегрузкой для всех типов атомов

    Class<?> anyObject(Object val) {
        return val != null ? val.getClass() : null;
    }
    
    <T> Class<?> anyGeneric(T val) {
        return val != null ? val.getClass() : null;
    }
    
    @Test
    public void anyAsObject_alsoViaGenerics() {
        assertEquals(String.class, anyObject("a string"));
        assertEquals(String.class, anyGeneric("a string"));
        // atomic arrays are Ok
        assertEquals(boolean[].class, anyGeneric(new boolean[]{}));
        assertEquals(int[].class, anyGeneric(new int[]{}));
        // atomic: auto-boxed and thus not Ok
        assertEquals(Boolean.class, anyObject(true));
        assertEquals(Boolean.class, anyGeneric(true));
        assertEquals(Integer.class, anyObject(125));
        assertEquals(Integer.class, anyGeneric(125));
    }
    
    // with overloading
    
    Class<?> any(Object val) {
        return val != null ? val.getClass() : null;
    }
    
    Class<?> any(boolean val) {
        return boolean.class;
    }
    
    Class<?> any(int val) {
        return int.class;
    }
    
    @Test
    public void any_overloadedForAtomic() {
        assertEquals(String.class, any("a string"));
        assertEquals(Boolean.class, any(Boolean.TRUE));
        assertEquals(Integer.class, any(Integer.valueOf(125)));
        assertEquals(boolean[].class, any(new boolean[]{}));
        assertEquals(int[].class, any(new int[]{}));
        // atomic
        assertEquals(boolean.class, any(true));
        assertEquals(int.class, any(125));
    }
    
0 голосов
/ 15 мая 2018

Лучший и самый простой способ - использовать метод перегрузки ... напишите свой метод несколько раз, каждый раз с разными сигнатурами ... посмотрите на это:

public void myFunc(int i)
{
System.out.println(i);
}
public void myFunc(double d)
{
System.out.println(d);
}
public void myFunc(String s)
{
System.out.println(s);
}
public void myFunc(boolean b)
{
System.out.println(b);
}
0 голосов
/ 15 мая 2018

Ты не.То, что вы хотите сделать, это перегрузить вашу функцию и реализовать каждый случай соответственно.В этом прелесть типизированных языков и прелесть объектно-ориентированного программирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...