Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Java > Generic methods: how to express explicit type parameters?

Reply
Thread Tools

Generic methods: how to express explicit type parameters?

 
 
z-man
Guest
Posts: n/a
 
      10-01-2006
Hi all

I'm struggling to solve this puzzle: I'm porting some C# code to Java
regarding some invocations to a couple of generic methods.

The problem is that the generic types of such generic methods cannot be
inferred by the compiler as they only refer to the returning value
(getter method: getEntry) and to some local variables inside the
respective code bodies (both getter and setter methods: getEntry and
setEntry).

So, it seems that an explicit type parameter invocation is needed: C#
supports it (see below), but I couldn't find an equivalent replacement
in Java till now.

Any idea?

Many thanks.

// C# version -------------------------------------
public string Name
{
get{return GetEntry<string,MyStringType>("name");}
set{SetEntry<string,MyStringType>("name",value);}
}

protected T GetEntry<T,TBase>(
string key
)
where TBase : MyBaseType<T>
{
try{return (T)((TBase)entries[key]).Value;}
catch{return default(T);}
}

protected void SetEntry<T,TBase>(
string key,
T value
)
where TBase : MyBaseType<T>, new()
{
if(!entries.ContainsKey(key))
entries[key] = new TBase();

((TBase)entries[key]).Value = value;
}

// Java version -----------------------------------
public String getName()
{
// Doesn't work! What's the equivalent syntax?
return getEntry<String,MyStringType>("name");
}

public void setName(
String value
)
{
// Doesn't work! What's the equivalent syntax?
setEntry<String,MyStringType>("name",value);
}

protected T <T,TBase extends MyBaseType<T>> getEntry(
String key
)
{
try{return (T)((TBase)entries.get(key))).getValue();}
catch{return default(T);}
}

protected void <T,TBase extends MyBaseType<T>> setEntry(
String key,
T value
)
{
if(!entries.containsKey(key))
entries.set(key,new TBase());

((TBase)entries.get(key))).setValue(value);
}
 
Reply With Quote
 
 
 
 
Piotr Kobzda
Guest
Posts: n/a
 
      10-01-2006
z-man wrote:

> // Java version -----------------------------------
> public String getName()
> {
> // Doesn't work! What's the equivalent syntax?
> return getEntry<String,MyStringType>("name");


return this.<String,MyStringType>getEntry("name");

> }
>
> public void setName(
> String value
> )
> {
> // Doesn't work! What's the equivalent syntax?
> setEntry<String,MyStringType>("name",value);


return this.<String,MyStringType>setEntry("name",value);

> }
>
> protected T <T,TBase extends MyBaseType<T>> getEntry(
> String key
> )
> {
> try{return (T)((TBase)entries.get(key))).getValue();}
> catch{return default(T);}
> }
>
> protected void <T,TBase extends MyBaseType<T>> setEntry(
> String key,
> T value
> )
> {
> if(!entries.containsKey(key))
> entries.set(key,new TBase());
>
> ((TBase)entries.get(key))).setValue(value);
> }


But all this won't work together in Java, because of erasure...

I think you need something like this:

public class YourCSharpPort {

public String getName() {
return getEntry("name", MyStringType.class);
}

public void setName(String value) {
setEntry("name", MyStringType.class, value);
}


Map<String, Object> entries;

protected <T, TBase extends MyBaseType<T>>
T getEntry(
String key, Class<TBase> typeOfTBase) {
TBase holder = typeOfTBase.cast(entries.get(key));
return holder != null ? holder.getValue() : null;
}

protected <T, TBase extends MyBaseType<T>>
void setEntry(
String key, Class<TBase> typeOfTBase,
T value) {
TBase holder = typeOfTBase.cast(entries.get(key));
if (holder == null && !entries.containsKey(key))
entries.put(key, holder = newInstanceOf(typeOfTBase));
holder.setValue(value);
}


protected <T> T newInstanceOf(Class<T> typeOfT) {
try {
return typeOfT.newInstance();
} catch (InstantiationException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}

}


HTH,
piotr
 
Reply With Quote
 
 
 
 
z-man
Guest
Posts: n/a
 
      10-01-2006
On 10/01/2006 10:31 PM, Piotr Kobzda wrote:
> z-man wrote:
>
>> // Java version -----------------------------------
>> public String getName()
>> {
>> // Doesn't work! What's the equivalent syntax?
>> return getEntry<String,MyStringType>("name");

>
> return this.<String,MyStringType>getEntry("name");
>
>> }
>>
>> public void setName(
>> String value
>> )
>> {
>> // Doesn't work! What's the equivalent syntax?
>> setEntry<String,MyStringType>("name",value);

>
> return this.<String,MyStringType>setEntry("name",value);
>
>> }
>>
>> protected T <T,TBase extends MyBaseType<T>> getEntry(
>> String key
>> )
>> {
>> try{return (T)((TBase)entries.get(key))).getValue();}
>> catch{return default(T);}
>> }
>>
>> protected void <T,TBase extends MyBaseType<T>> setEntry(
>> String key,
>> T value
>> )
>> {
>> if(!entries.containsKey(key))
>> entries.set(key,new TBase());
>>
>> ((TBase)entries.get(key))).setValue(value);
>> }

>
> But all this won't work together in Java, because of erasure...
>
> I think you need something like this:
>
> public class YourCSharpPort {
>
> public String getName() {
> return getEntry("name", MyStringType.class);
> }
>
> public void setName(String value) {
> setEntry("name", MyStringType.class, value);
> }
>
>
> Map<String, Object> entries;
>
> protected <T, TBase extends MyBaseType<T>>
> T getEntry(
> String key, Class<TBase> typeOfTBase) {
> TBase holder = typeOfTBase.cast(entries.get(key));
> return holder != null ? holder.getValue() : null;
> }
>
> protected <T, TBase extends MyBaseType<T>>
> void setEntry(
> String key, Class<TBase> typeOfTBase,
> T value) {
> TBase holder = typeOfTBase.cast(entries.get(key));
> if (holder == null && !entries.containsKey(key))
> entries.put(key, holder = newInstanceOf(typeOfTBase));
> holder.setValue(value);
> }
>
>
> protected <T> T newInstanceOf(Class<T> typeOfT) {
> try {
> return typeOfT.newInstance();
> } catch (InstantiationException e) {
> throw new RuntimeException(e);
> } catch (IllegalAccessException e) {
> throw new RuntimeException(e);
> }
> }
>
> }
>
>
> HTH,
> piotr



Many thanks Piotr, I'll get a try of it!
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Re: How include a large array? Edward A. Falk C Programming 1 04-04-2013 08:07 PM
not just generic type programming,but also parallism generic syntaxprogramming?? minlearn C++ 2 03-13-2009 05:17 PM
Explicit instantiation of STL vector demands explicit instantiation of all the templates it using internally. krunalbauskar@gmail.com C++ 1 12-25-2006 03:51 PM
What's the difference betwwen explicit instantiaion and explicit specialization? Andy C++ 5 01-30-2005 11:46 PM
Is explicit template qualification required for explicit delete? J.T. Conklin C++ 1 08-11-2004 02:06 AM



Advertisments