这是我基本上想要的代码,它不会编译:
interface Interface {
interface ArgumentInterface {
// Some methods
}
void doCallback(Consumer<? super ArgumentInterface> callback);
}
interface SubInterface extends Interface {
interface ArgumentSubInterface extends ArgumentInterface {
// Some more methods
}
@Override
void doCallback(Consumer<? super ArgumentSubInterface> callback);
}
Run Code Online (Sandbox Code Playgroud)
这里的想法是Interface将ArgumentInterface的实例传递给用户提供的Consumer,而SubInterface将传递更具体的ArgumentSubInterface的实例.特别是,我希望用户能够将Consumer <ArgumentSubInterface>传递给SubInterface.doCallback()并使其工作.
天真地看起来这应该像写作一样:接口版本接受的任何参数也将被SubInterface的版本接受.但是,Java声称该方法不会覆盖.
问题与解释
在Java中是否有办法将HashSet<Class>参数移交给方法,以便该方法接受HashSets的子类Class?
如果有一个类的几个子类,这些子类的差异与所讨论的方法无关,那么这将非常有用.如果这是不可能的,那么处理这个的唯一选择似乎就是
......两者都不太实际.
版本是Java 8(openjdk 1.8.0).
例
假设所有文件都在同一目录中,这样我们就不必担心彼此导入的包和文件.考虑NNB类和子类NNC(NNB的子类).
NNB.java:
import java.util.HashMap;
import java.util.Map;
public class NNB {
public final Map<Long, Double> dict;
public NNB () {
this.dict = new HashMap<Long, Double>();
int c = 0;
while (c<10) {
Long XX = (long)10;
Double YY = 2.0;
this.dict.merge(XX, YY, Double::sum);
System.out.println(dict);
c++;
}
}
}
Run Code Online (Sandbox Code Playgroud)
NNC.java:
import java.util.HashMap;
import java.util.Map;
public class NNC extends NNB {
private Map<Long, Double> dict2;
public NNC …Run Code Online (Sandbox Code Playgroud) 这是一个学术问题,旨在更好地理解泛型在这种情况下的行为。
该Enum类型被描述为“所有 Java 语言枚举类型的公共基类”。它的定义是:
public abstract class Enum<E extends Enum<E>>
implements Comparable<E>, Serializable {
}
Run Code Online (Sandbox Code Playgroud)
现在,我可以用这个定义定义一个字段:
public class MyClass {
public Enum<MyEnum> field;
}
Run Code Online (Sandbox Code Playgroud)
一切都很好。现在,更进一步。因为Enum<MyEnum>显然等同于MyEnum这会让我相信根据定义我也可以写:
public class MyClass {
public Enum<Enum<MyEnum>> field;
}
Run Code Online (Sandbox Code Playgroud)
但是现在编译器实际上阻止了我:Type parameter 'java.lang.Enum' is not within its bound; should extend 'java.lang.Enum<MyEnum>>它根据定义进行操作,因为它仍然满足:E extends Enum<E>。当然,您不允许这种重复(或者可能更好,发生)构造的原因有很多,但给出的一个对我来说确实是错误的。
另一方面,如果我要定义一个这样的类(类似于 的定义Enum)
public class Wrapper<T extends Number> {
}
Run Code Online (Sandbox Code Playgroud)
我将能够编写一个类:
public class Wrapper<T extends Number> {
}
Run Code Online (Sandbox Code Playgroud)
我是忽略了什么还是我的分析被误导了?
方差(尤其是逆变)问题让我头撞墙一周了。由于这里的几个问题,我终于理解了这个理论,现在一旦我开始研究它,我就会遇到我不明白的错误。
我有一个简单的类层次结构:
抽象类 Fruit,Mango 扩展 Fruit,Orange 扩展 Fruit,BloodOrange 扩展 Orange
abstract class Fruit implements PlantEatable {
private boolean isRipe;
private boolean isEatable;
public boolean isRipe() {
return isRipe;
}
public void setRipe(boolean ripe) {
isRipe = ripe;
}
@Override
public boolean isEatable() {
return isEatable;
}
public void setEatable(boolean eatable) {
isEatable = eatable;
}
}
public class Mango extends Fruit {
}
public class Orange extends Fruit{
}
public class BloodOrange extends Orange{
}
Run Code Online (Sandbox Code Playgroud)
现在,Oracle 文档总体上对泛型非常了解,除了我觉得令人困惑的最重要的部分:https ://docs.oracle.com/javase/tutorial/java/generics/wildcardGuidelines.html
如果我正在做 …
在Java中有一种方法可以强制转换以下内容:
ArrayList<IMyType> list
成
ArrayList<MyType>
如果
MyType implements IMyType
?