gpt4 book ai didi

java - 如何在接口(interface)默认方法中初始化Class

转载 作者:行者123 更新时间:2023-12-01 18:00:13 26 4
gpt4 key购买 nike

我有一个界面:

public interface ITransformer<S,T>{

public void transform(S source,T target);

default String getTransformerName(){
Class<S> s;
Class<T> t;

return s.getName() + t.getName(); //*********
}

}

错误消息加星号的行:

The local variable s may not have been initialized

The local variable t may not have been initialized

我想使用此方法返回带有 [S.classname][T.classname] 的字符串。请让我知道如何实现这一点,或者这在界面上不可能做到吗?

更新:1 月 12 日

我这样做的目的是因为这个类将在框架中,我想尽可能减少人为错误。我正在更改代码如下:

public interface ITransformer<S,T>{

public void transform(S source,T target);

public FieldEntry<S, T> getTransformerName();

}


public class FieldEntry<S,T> implements Comparable<FieldEntry> {

private Class<S> s;
private Class<T> t;

public FieldEntry(Class<S> s,Class<T> t){
this.s = s;
this.t = t;
}

public String getEntryName(){
return s.getName() + t.getName();

}

@Override
public int compareTo(FieldEntry entry) {
if(entry == null) throw new IllegalArgumentException("The argument to compare cannot be null!");

return entry.getEntryName().compareTo(this.getEntryName());
}

}

最佳答案

为了演示为什么这不起作用,您可以将您的类更改为

public interface ITransformer<S,T>{

public void transform(S source,T target);

static <In,Out> ITransformer<In,Out> noOp() {
return (source,target) -> {};
}
static void main(String... arg) {
ITransformer<String,Integer> t1 = noOp();
ITransformer<Long,Thread> t2 = noOp();

System.out.println(t1 == (Object)t2);
}
}

运行此命令将打印true。换句话说,两个函数都由相同的实例表示,因此不能有属性允许识别它们的不同类型。

通常,当两个函数(lambda 表达式或方法引用)表现出相同的行为时,JVM 可能会用相同的实现类型甚至相同的实例来表示它们。

即使对于非接口(interface)类,由于类型删除,这也不起作用。它仅在您具有扩展或实现泛型类型的可具体化(即非泛型)类型时才有效。

关于java - 如何在接口(interface)默认方法中初始化Class<T>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41588226/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com