【发布时间】:2014-05-07 19:30:34
【问题描述】:
请考虑以下 3 个 Java 类:
超类:
public abstract class Column<T>
{
private final Class<T> type;
private final String name;
public Column(Class<T> type, String name)
{
this.type = type;
this.name = name;
}
public Class<T> getType()
{
return type;
}
// ...
}
工作子类:
public class FloatColumn extends Column<Float>
{
public FloatColumn(String name)
{
super(Float.class, name);
}
// ...
}
有问题的子类:
public class ListColumn<L extends List<T>, T> extends Column<L>
{
public ListColumn(String name)
{
super((Class<L>) List.class, name);
}
// ...
}
有问题的子类 (ListColumn) 在 Eclipse 中编译良好,Java 编译器合规性设置为 1.6。但是,当通过 Maven 编译时(使用 JDK 编译器,源和目标设置为 1.6),我在 super() 构造函数中的 super() 调用处收到 Inconvertible types 错误。
编辑: Eclipse 确实警告了这一行 (Type safety: Unchecked cast from Class<List> to Class<L>)。
我知道 Eclipse 不使用 JDL 编译器,显然它使用的编译器没有 JDK 严格。
但是,我的问题是如何使这段代码在 1.6 JDK 编译器上工作。
换句话说,我如何使用符合预期Class<L> 类型的参数调用超级构造函数,其中L 被限制为extends List<T>。
最好我只想在 ListColumn 构造函数中进行更改,而不是在 Column 类中进行更改。
【问题讨论】:
-
查看这一行的警告
super((Class<L>) List.class, name); -
我在该行没有收到警告(至少在 Eclipse 中没有)。相反,我得到了一个编译错误。你知道我应该在代码中改变什么吗?
-
我得到 Type safety: Unchecked cast from Class
- to Class
-
哎呀,你是对的。我没有看到警告,因为我在构造函数上有
@SuppressWarnings("unchecked")。 -
万岁,成功了!谢谢!
标签: java eclipse maven generics collections