当前位置: 首页 > 知识库问答 >
问题:

当双变量被转换为泛型类型T时,如何抛出ClassCastException?

孔和畅
2023-03-14

我正在实现一个泛型类LabelEncoder

/**
 * Encodes target labels with value between 0 and n_classes-1.
 * If T is comparable, this class supports encoding by "natural-order" or by "index-order".
 * Otherwise, this class only supports encoding by "index-order".
 *
 * @param <T> the Java Class of labels
 * @author Cloudy1225
 */
public class LabelEncoder <T> extends Encoder<T>{

    /**
     * Holds the mapping between labels and encodings.
     */
    public Map<T, Double> encodingMap;

    /**
     * Whether this encoder has already been fitted.
     */
    private boolean fitted;


    /**
     * Creates a LabelEncoder.
     */
    public LabelEncoder() {}

    /**
     * Fits the label encoder by "natural-order" or by "index-order".
     *
     * @param labels a double array of target values.
     * @param natural true: encode by "natural-order"; false: encode by "index-order"
     * @throws ClassCastException if the generic type of this class is not Double
     */
    public void fit(double[] labels, boolean natural) {
        this.reset(natural);
        Double encoding = 0.0;
        for (Double label: labels) {
************T l = (T) label;************
            Double oldValue = this.encodingMap.put(l, encoding);
            if (oldValue == null) { // It denotes that the label hadn't been in the map.
                encoding++;
            }
        }
        this.fitted = true;
    }

     /**
     * Fits the label encoder by "natural-order" or by "index-order".
     * If given labels are not comparable, "natural" will be automatically set false.
     *
     * @param labels an array of target values.
     * @param natural true: encode by "natural-order"; false: encode by "index-order"
     */
    public void fit(T[] labels, boolean natural) {
        if (!(labels instanceof Comparable[])) {
            natural = false;
        }
        this.reset(natural);
        Double encoding = 0.0;
        for (T label: labels) {
            Double oldValue = this.encodingMap.put(label, encoding);
            if (oldValue == null) { 
                encoding++;
            }
        }
        this.fitted = true;
    }

     /**
     * Resets or initializes before being fitted.
     *
     * @param natural true: encode by "natural-order"; false: encode by "index-order"
     */
    private void reset(boolean natural) {
        // Sorting is implemented by TreeMap or by LinkedHashMap.
        if (natural) {
            this.encodingMap = new TreeMap<T, Double>();
        } else {
            this.encodingMap = new LinkedHashMap<T, Double>();
        }
        this.fitted = false;
    }

    public static void main(String[] args) {
        LabelEncoder<String> encoder = new LabelEncoder<>();
        encoder.fit(new double[] {3,4,5}); // It's expected that a ClassCastException will be thrown here.
        Map<String, Double> map = encoder.encodingMap;
        System.out.println(map);
    }
}

测试结果如下:

{3.0=0.0, 4.0=1.0, 5.0=2.0}

那么如何在执行T l=(T)标签时抛出ClassCastException;

提前感谢!


共有1个答案

许奇
2023-03-14

由于您正在执行new Double[]{3,4,5},因此您正在进行隐式的双精度强制转换,因此您实际上是在向方法传递一个双精度数组,因此您不能期望出现ClassCastException。此外,您不能期望从强制转换到泛型的Exception是完全合法的强制转换。如果您想抛出异常,您应该尝试以下内容:

if(!(label instanceof Double))
    throw new Exception("Not a Double");

请进一步详细说明您试图实现的目标,因为我不清楚。

 类似资料:
  • 我在我的一个实用程序类中有一个方法,它接受一个集合和一个类对象,并返回一个Iterable实例,该实例可以遍历作为指定类实例的集合的所有成员。其签名为: 这对于大多数用例都非常有效,但现在我需要将其与泛型类

  • 我正在尝试有一个通量通用转换器使用通用类型在Java 8。我把我的代码建立在这个答案的基础上。其思想基本上是实现这个特定的转换器->: 类型转换器->转换为我想要的任何类型。因此,我正在使用构造函数创建一个类型为的类,并返回一个方法。我想在调用上创建类似这样的多个条目:,但类类型不同。但它甚至对整数也不起作用。 当我使用此单元测试进行测试时,我得到错误:。

  • 我在这里遇到了一个关于带列表的泛型有界类型的小问题。请帮帮我! 有什么方法可以克服这个问题,或者我可以安全地压制警告吗?

  • 我正在修改open JDK以添加特性,我已经遇到了两次,但没有好的解决方案。

  • 在下面来自的语法中,泛型类型参数在实例化原始类型数组后用于类型转换,

  • 我有一个父类来处理我所有的自定义异常,父母异常。我希望所有的子异常都有一个方法来向异常添加消息。为了做到这一点,我创建了一个泛型方法,在向其添加消息后返回泛型类型的对象。我在父类方法中使用来添加消息,然后返回,但是由于该方法返回泛型类型,所以我将其转换为泛型类型T。这似乎是可行的,但是给出了警告。我的代码如下: 该行给出的警告是。这种方法似乎确实如预期的那样有效,所以我并不担心,但我想更好地理解为