Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java Generics Value.<SomeValue>

Tags:

java

generics

I had an interview test and saw the following code:

EDIT:

public class TestValue {
    private Value<SomeValue> defaultValue;

    @Test
    public void Empty_Value_Has_No_Value() {
        Assert.assertFalse(Value.<SomeValue> createEmptyValue()
            .hasValue());
    }

    @Test
    public void Default_Value_IsEmpty() {
        Assert.assertEquals(Value.<SomeValue> createEmptyValue(),
            defaultValue);
    }

    @Test
    public void Non_Empty_Value_Has_Value() {
        Assert.assertTrue(new Value<SomeValue>(true, new SomeValue())
            .hasValue());
    }
}

I had never seen Java generic like

Value.<SomeValue>

The test is to implement Value class with the given unit test code above.

I tried to figure out the Value method signature below (need implementation):

public interface Value<T> {

    public boolean hasValue();
    public Value<T> createEmptyValue();
}

Any one know, please help?

Thank you

EDIT: Should be like this according to answers below @marlon

public class Value<T> {

    public boolean hasValue(){}
    public static <M> Value<M> createEmptyValue(){}; //need <M>
}

The key syntax to know:

Value.<SomeValue>  //ClassName.<Type>method

is way to invoke static method of a class with parameterized argument.

EDIT: according to @snipes83, syntax to invoke non-static method of a class with parameterized argument.

SomeObject.<Type>method
like image 210
Eric Avatar asked Jun 05 '13 01:06

Eric


People also ask

What is generic value in Java?

Generic Method: Generic Java method takes a parameter and returns some value after performing a task. It is exactly like a normal function, however, a generic method has type parameters that are cited by actual type. This allows the generic method to be used in a more general way.

Do generics allow for code reuse?

By making use of generic classes and methods, one can also reuse the code as per one required data type during implementation.

What is the difference between T and E in Java generics?

Well there's no difference between the first two - they're just using different names for the type parameter ( E or T ). The third isn't a valid declaration - ? is used as a wildcard which is used when providing a type argument, e.g. List<?>


1 Answers

Value.<SomeValue> it's the way generics are represented for methods.

Using Google Guava's Optional as an example:

Optional<String> email = Optional.<String>of(strEmail);

See Generic Types - Invoking generic methods

Since interfaces cannot declare static methods (shame on you java), just declare your method as static and forget about the interface, like this:

class Value<T> {

    public static <T> Value<T> createEmptyValue(){
        return null;
    }
}
like image 160
Marlon Bernardes Avatar answered Sep 28 '22 00:09

Marlon Bernardes