我正在使用Java™中的泛型,并且发现我有一个小问题。我知道Java™使用type erasure;但是,我需要在运行时获取泛型的类。因此,我使用一个简单的解决方法来查找泛型的类,描述为here。我遇到的问题是当我编译时,javac
吐出这个:
C:\blah\Board.java:65: error: type argument T#1 is not within bounds of type-variable T#2
this.boardManager = new NumberBoardManager<T>(c);
^
where T#1,T#2 are type-variables:
T#1 extends Comparable<? super T#1> declared in class Board
T#2 extends Number,Comparable<? super T#2> declared in class NumberBoardManager
C:\blah\Board.java:65: error: constructor NumberBoardManager in class NumberBoardManager<T#2> cannot be applied to given types;
this.boardManager = new NumberBoardManager<T>(c);
^
required: Class<T#1>
found: Class<CAP#1>
reason: actual argument Class<CAP#1> cannot be converted to Class<T#1> by method invocation conversion
where T#1,T#2 are type-variables:
T#1 extends Comparable<? super T#1> declared in class Board
T#2 extends Number,Comparable<? super T#2> declared in class NumberBoardManager
where CAP#1 is a fresh type-variable:
CAP#1 extends Object from capture of ?
第一个错误是有意义的,因为我所在的类Board
有一个只扩展Comparable<? super T>
的泛型,而这个特定的构造函数使用我想要的事实(但不一定有)泛型也扩展Number
。我想通过使用通用我创建boardManager
以扩展Number
和Comparable<? super T>
来修复此问题,并在通用不扩展{{1}时出错}。但我不知道有什么语法可以帮助我。
导致第二个错误,因为我已使用通用Number
初始化boardManager
。但是,如果我们知道T
实现T
,为什么会抛出此错误?我希望通过解决第一个问题,第二个问题也得到了解决。这里有一些提供上下文的代码,如果你仍然感到困惑,我愿意提供更多。
Comparable<? super T>
public class Board<T extends Comparable<? super T>> extends Object implements Serializable
{
private BoardManager<T> boardManager;
public Board(int size)
{
Class<?> c = ((Class<?>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0]);
if(c.isAssignableFrom(Number.class))
{
this.boardManager = new NumberBoardManager<T>(c); //this is the line
}
}
}
任何和所有帮助将不胜感激!
答案 0 :(得分:1)
我希望通过使用通用我来创建boardManager以扩展Number和Comparable来解决这个问题,并且如果泛型不扩展Number则会出错。
你做不到。
您不能在类上使用仅允许某些类型参数化的方法;该类必须能够使用任何允许的类型参数完全起作用。
您需要约束整个Board
课程,使T
成为Number
。
另一个错误是因为Class<?>
与Class<T>
不兼容。 <?>
表示类型参数可能是任何可能的类型;它可能是违反T
约束的东西
您需要转换为Class<T>
。