.
, , , . , , :
class Container<A<B>> {}
"A" , , , . , "A" - , , , :
class Container<A extends Foo<B>> {}
, API:
interface Container<KeyType, ValueType>
{
void put(KeyType k, ValueType v);
ValueType get(KeyType k);
}
/ ( java.util.Map, ), :
interface StringContainer extends Container<String, String>
{
void put(String k, String v);
String get(String k);
}
interface FooBarContainer<C> extends Container<Foo<C>, Bar<C>>
{
void put(Foo<C> k, Bar<C> v);
Bar<C> get(Foo<C> k);
}
/ ValueType.
KeyType ValueType , :
interface VarContainer
{
<VariantType> void put(Foo<VariantType> k, Bar<VariantType> v);
<VariantType> Bar<VariantType> get(Foo<VariantType> k);
}
/ VarContainer:
VarContainer vc = ...
vc.put(new Foo<String>(), new Bar<String>());
vc.put(new Foo<Long>(), new Bar<Long>());
:
interface VarContainer<VariantType> extends Container<Foo<VariantType>, Bar<VariantType>>
{
void put(Foo<VariantType> k, Bar<VariantType> v);
Bar<VariantType> get(Foo<VariantType> k);
}
, , Foo Bar:
interface FooBarVarContainer
{
<VariantType> void put(Foo<VariantType> k, Bar<VariantType> v);
Bar<VariantType> get(Foo<VariantType> k);
}
Foo/Bar, put :
FooBarVarContainer vc = ...
vc.put(new Foo<String>(), new Bar<String>());
vc.put(new Foo<String>(), new Bar<Long>());
Bar<Long> = vc.get(new Foo<Long>());
, ?
, , hashCode equals, , . , - , - .