广泛使用Java泛型是否有任何缺点?

时间:2014-11-17 12:46:21

标签: java generics

从技术角度来看,使用泛型是否有任何不足之处,如下面的方法createColumn()

public static <S, T> TableColumn<S, T> createColumn(final Class<S> sType, 
                                                    final Class<T> tType, 
                                                    final int minWidth, 
                                                    final Callback<TableColumn<S, T>, TableCell<S, T>> cellFactory) {
  TableColumn<S, T> tableColumn = new TableColumn<S, T>();

  tableColumn.setMinWidth(minWidth);
  tableColumn.setCellFactory(cellFactory);

  return tableColumn;
}

以前,我一直在以这种方式为JavaFX创建TableColumn个对象:

TableColumn<Example, String> colExample = new TableColumn<Example, String>();
colExample.setMinWidth(100);
colExample.setCellFactory(myCellFactory);
...

TableColumn<Other, String> colAnother = new TableColumn<Other, String>();
colAnother.setMinWidth(50);
colAnother.setCellFactory(myOtherFactory);
...

由于我有很多专栏,我想在工厂方法中结束创建,并提出我的createColumn()方法作为对象创建的单点:

TableUtil.createColumn(Example.class, String.class, 100, myCellFactory);
TableUtil.createColumn(Other.cass, String.class, 50, myOtherFactory);

创作工作正常,但是,我对createColumn()中的所有泛型感觉有点不安全(可能因为我还没有经常使用泛型)。这样做是聪明的想法吗?或者这种方法有任何缺点或不安全感吗?

3 个答案:

答案 0 :(得分:1)

泛型仅用于帮助我们 - 正如您所知,它是一种编译时功能,可对我们使用的类型进行检查并防止意外ClassCastException

我可以看到,你不能使用你传递的Class对象,所以我会把你的方法重写为:

public static <S, T> TableColumn<S, T> createColumn(final int minWidth, 
                                                    final Callback<TableColumn<S, T>, 
                                                    TableCell<S, T>> cellFactory) {
  TableColumn<S, T> tableColumn = new TableColumn<S, T>();

  tableColumn.setMinWidth(minWidth);
  tableColumn.setCellFactory(cellFactory);

  return tableColumn;
}

并将调用它:

TableUtil.<Example, String>createColumn(100, myCellFactory);

没有必要使用冗余Class参数来加载方法签名,因为您只需指出泛型类型。

答案 1 :(得分:0)

  

这样做是否明智?或者这种方法有任何缺点或不安全感吗?

您的代码没问题。泛型没有运行时成本,只存在于编译时。

答案 2 :(得分:0)

解决方案:在您提供所有提示和建议之后,这就是我最终获得代码的方式。

public static <S, T> TableColumn<S, T> createColumn(final int minWidth,
                                                    final Callback<TableColumn<S, T>, TableCell<S, T>> cellFactory) {
  TableColumn<S, T> tableColumn = new TableColumn<>();

  tableColumn.setMinWidth(minWidth);
  tableColumn.setCellFactory(cellFactory);

  return tableColumn;
}

创建列:

TableColumn<Example, String> colExample = TableUtil.createColumn(100, myCellFactory);
TableColumn<Other, String> colOther = TableUtil.createColumn(50, myOtherFactory);