Saturday 15 January 2011

How and when the type gets resolved for generic methods in java? -



How and when the type gets resolved for generic methods in java? -

i expect next unit test fail classcastexception, passing.

the class has generic method sec parameter , homecoming value of type v.

on calling method sec time, type of sec parameter v integer, homecoming type should integer. @ runtime returns string value.

import java.util.hashmap; import java.util.map; import org.junit.test; public class genericmethodtest { private class nongenericclass { private final map<object, object> mymap = new hashmap<>(); <k, v> v addgeneric(k key, v value) { v existingv = (v) mymap.get(key); // why no classcastexception on above line, when type of v integer, mymap.get(key) returns value of // type string? if (existingv == null) { mymap.put(key, value); homecoming value; } homecoming existingv; } } @test public void test() { nongenericclass nongenericclass = new nongenericclass(); nongenericclass.addgeneric("one", "one"); // string valuestring = (string) nongenericclass.addgeneric("one", integer.valueof(1)); // compiler error expected, if above line uncommented - cannot cast integer string. // no error @ run-time, , below phone call returns value of type string. nongenericclass.addgeneric("one", integer.valueof(1)); } }

this due type erasure. basically, types of k , v aren't known @ execution time. cast v unchecked - , should have received warning @ compile-time (possibly suggesting compile -xlint).

if want cast checked @ execution time, you'll need relevant class object, @ point can utilize class.cast check it.

see type erasure in java generics faq more information, along "can cast parameterized type?".

java generics methods

No comments:

Post a Comment