相关疑难解决方法(0)

子类型如何"保证"它将使用更具体的类型调用回调?

这是我基本上想要的代码,它不会编译:

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 generics

0
推荐指数
1
解决办法
55
查看次数

在Java中是否有办法将HashSet <Class>参数移交给方法,以便该方法接受Class的子类的HashSets?

问题与解释

在Java中是否有办法将HashSet<Class>参数移交给方法,以便该方法接受HashSets的子类Class

如果有一个类的几个子类,这些子类的差异与所讨论的方法无关,那么这将非常有用.如果这是不可能的,那么处理这个的唯一选择似乎就是

  • 编写与子类一样多的方法
  • 循环遍历调用函数中的HashSet并调用类似的方法,将各个类实例作为参数而不是HashSets

......两者都不太实际.

版本是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)

java inheritance hashset

0
推荐指数
1
解决办法
97
查看次数

为什么我不能在 java java.lang.Enum 泛型类型定义中重现?

这是一个学术问题,旨在更好地理解泛型在这种情况下的行为。

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)

我是忽略了什么还是我的分析被误导了?

java generics enums

0
推荐指数
1
解决办法
71
查看次数

Java 泛型 PECS,添加捕获?super 不能应用于 java.util.list

方差(尤其是逆变)问题让我头撞墙一周了。由于这里的几个问题,我终于理解了这个理论,现在一旦我开始研究它,我就会遇到我不明白的错误。

我有一个简单的类层次结构:

抽象类 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 generics collections contravariance consumer

0
推荐指数
1
解决办法
276
查看次数

集合元素的内部演员

在Java中有一种方法可以强制转换以下内容:

ArrayList<IMyType> list

ArrayList<MyType>

如果

MyType implements IMyType

java collections casting

-1
推荐指数
1
解决办法
61
查看次数