문제

I am not quite sure how to phrase my question, so I am gonna give an example:

Take this map for example:

Map<Class<? extends DatabaseEntry>, Class<? extends IDecorator<? extends DatabaseEntry>>> map;

It maps for example MyClass that extends DatabaseEntry to its IDecorator<MyClass>. The problem with the above statement is, that it is too unspecific. I want more type-safety. Something like this:

Map<Class<T extends DatabaseEntry>, Class<? extends IDecorator<T>>> map;

Of course, T would differ from entry to entry, but what I want is that if I call:

map.get(MyClass.class);

the return type would be IDecorator<MyClass> instead of IDecorator<? extends DatabaseEntry>

Is there a simple solution to that?

도움이 되었습니까?

해결책 2

As far as I know - no way to do that.
You cannot of course use T, T must be a part of a generic definition,
and cannot be in a standalone definition of a variable like that, this is what you have wildcards ( ? ) for.
Since your map is taking for key and value objects of Class
You cannot even solve this by simply extending the types of the key and value (as Class is final).

다른 팁

As @zaske already pointed out in his answer, this doesn't seem to be possible.

Along the lines of what you're already thinking about, you could wrap up your Map in a class that provides generified get and put methods as the ones you want.

public class MapWrapper { 

    Map<Class<? extends DatabaseEntry>, Class<? extends IDecorator<? extends DatabaseEntry>>> map;
    public <T extends DatabaseEntry> Class<IDecorator<T>> put (Class<T> k, Class<IDecorator<T>> v){
        return (Class<IDecorator<T>>) map.put(k,v);
    }

    public <T extends DatabaseEntry> Class<IDecorator<T>> getObject(Class<T> k) {
        return (Class<IDecorator<T>>) map.get(k);
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top