我正在实现一个泛型类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;
?
提前感谢!
由于您正在执行new Double[]{3,4,5}
,因此您正在进行隐式的双精度强制转换,因此您实际上是在向方法传递一个双精度数组,因此您不能期望出现ClassCastException。此外,您不能期望从强制转换到泛型的Exception是完全合法的强制转换。如果您想抛出异常,您应该尝试以下内容:
if(!(label instanceof Double))
throw new Exception("Not a Double");
请进一步详细说明您试图实现的目标,因为我不清楚。
我在我的一个实用程序类中有一个方法,它接受一个集合和一个类对象,并返回一个Iterable实例,该实例可以遍历作为指定类实例的集合的所有成员。其签名为: 这对于大多数用例都非常有效,但现在我需要将其与泛型类
我正在尝试有一个通量通用转换器使用通用类型在Java 8。我把我的代码建立在这个答案的基础上。其思想基本上是实现这个特定的转换器->: 类型转换器->转换为我想要的任何类型。因此,我正在使用构造函数创建一个类型为的类,并返回一个方法。我想在调用上创建类似这样的多个条目:,但类类型不同。但它甚至对整数也不起作用。 当我使用此单元测试进行测试时,我得到错误:。
我在这里遇到了一个关于带列表的泛型有界类型的小问题。请帮帮我! 有什么方法可以克服这个问题,或者我可以安全地压制警告吗?
我正在修改open JDK以添加特性,我已经遇到了两次,但没有好的解决方案。
在下面来自的语法中,泛型类型参数在实例化原始类型数组后用于类型转换,
我有一个父类来处理我所有的自定义异常,父母异常。我希望所有的子异常都有一个方法来向异常添加消息。为了做到这一点,我创建了一个泛型方法,在向其添加消息后返回泛型类型的对象。我在父类方法中使用来添加消息,然后返回,但是由于该方法返回泛型类型,所以我将其转换为泛型类型T。这似乎是可行的,但是给出了警告。我的代码如下: 该行给出的警告是。这种方法似乎确实如预期的那样有效,所以我并不担心,但我想更好地理解为