我试图做类似的事情:
public class MyClass <A, B, C <A, B> > {
...
}
但Eclipse突出显示“B”,并表示“意外的,预期的延伸”。是什么赋予了?嵌套的泛型是不允许的?
答案 0 :(得分:8)
这是因为您没有将C
定义为本身键入2个类型参数的类型。
尝试这样的事情:
public class MyClass <A, B, C extends Map<A, B>> {
// This compiles
}
答案 1 :(得分:3)
如果模板参数不共享共享类层次结构,则可以使用接口。
例如:
interface IConverter<TFrom, TTo>
{
TTo convert(TFrom from);
}
class IntToStringConverter implements IConverter<Integer, String>
{
public String convert(Integer from)
{
return "This is a string: " + from.toString();
}
}
class ConverterUser<TConverter extends IConverter<TFrom, TTo>, TFrom, TTo>
{
public ConverterUser()
{
}
private List<TConverter> _converter2;
private TConverter _converter;
public void replaceConverter(TConverter converter)
{
_converter = converter;
}
public TTo convert(TFrom from)
{
return _converter.convert(from);
}
}
class Test
{
public static void main(String[] args)
{
ConverterUser<IntToStringConverter, Integer, String> converterUser =
new ConverterUser<IntToStringConverter, Integer, String>();
converterUser.replaceConverter(new IntToStringConverter());
System.out.println(converterUser.convert(328));
}
}
答案 2 :(得分:3)
这在Java中是不可能的。请参阅语言定义的Type Variables部分以及Generic Classes and Type Parameters。我最近看到(某处)提到Java无法做到这一点,但Scala可以做到这一点。这由Scala Language Specification的S4.4确认。
以下代码编译成功也证实了这一点。
class MyClass [A, B, C [A, B]] {
}
在java中编译产生了以下答案。
MyClass.java:1: > expected
class MyClass <A, B, C<A, B>> {
^
MyClass.java:1: <identifier> expected
class MyClass <A, B, C<A, B>> {
^
MyClass.java:1: ';' expected
class MyClass <A, B, C<A, B>> {
^
MyClass.java:2: reached end of file while parsing
}
^
4 errors
我猜想你的问题有一个更简单的解决方案,因为这有点不寻常。
答案 3 :(得分:2)
您不必声明这样的嵌套类型。简单地
class MyClass<A, B, C> {}
当您创建MyClass时,您可以执行类似
的操作MyClass<List<String>, Set<Date>, Map<Integer, Long>> instance;
答案 4 :(得分:1)
我猜你希望MyClass是一个带有类型参数A,B和C的泛型类。此外,你希望C是一个带有类型参数A和B的泛型类。
这样我就可以写
了MyClass < String , Date , Map < String , Date > >
MyClass < String , Date , Hashtable < String , Date > >
但不是MyClass < String , Date , ElementVsitor < Date , String > >
然后我认为你不能那样做。