我在列表中使用通配符和下界泛型,但编译器抛出错误.
码:
int intStart = 0;
Number num = new Integer(2);
List<? super Integer> listOfNumbers = new ArrayList<>();
listOfNumbers.add(intStart);
listOfNumbers.add(num); //throws compiler error
Run Code Online (Sandbox Code Playgroud)
错误:
类型List中的方法add(capture#8-of?super Integer)不适用于参数(Number)
有了List<? super Integer>,我应该被允许添加任何类型的对象Integer或其超类型,例如数字或对象.我已经经历了一些SO讨论,但无法找到为什么我应该犯错误.
我知道我们无法在列表中添加扩展边界类型的元素。但我仍然不确定为什么java编译器不允许这样做。因为编译器可以很容易地检查添加的新元素是否是泛型类型的子类型。有人可以帮我解决这个问题吗?
我已经根据这个答案在JavaFX中创建了一个自定义表格单元格,因此我可以为单元格文本的不同部分设置不同的字体样式.
我在两种不同类型的TableView上使用这个自定义表格单元格:TableView<Track>和TableView<Album>.
两者Track并Album实现接口AlbumInfoSource:
public interface AlbumInfoSource {
public String getAlbumTitle();
public String getFullAlbumTitle();
public String getReleaseType();
public String getDiscSubtitle();
public Integer getDiscCount();
public Integer getDiscNumber();
}
Run Code Online (Sandbox Code Playgroud)
我的自定义TableCell使用该AlbumInfoSource键入,因此它可以为a TableView<Album>和a 渲染单元格TableView<Track>.
这是基本代码:
public class FormattedAlbumCell<T, S> extends TableCell <AlbumInfoSource, String> {
private TextFlow flow;
private Label albumName, albumType, albumDisc;
public FormattedAlbumCell () {
/* Do constructor stuff */
}
@Override
protected void updateItem ( String text, boolean …Run Code Online (Sandbox Code Playgroud) 我正在尝试运行以下代码,它打印给定集合的所有子集。当我将subsets(int[] nums)函数的返回类型更改为ArrayList<ArrayList<Integer>> subsets(int[] nums),但不适用于List<List<Integer>> subsets(int[] nums). 我需要将返回类型设为List<List<Integer>>. 我该如何解决?
public class TestPractice {
public static void main(String[] args){
int[] x = {1,2};
System.out.println(subsets(x));
}
public static List<List<Integer>> subsets(int[] nums) {
List<ArrayList<Integer>> subsets = new ArrayList<ArrayList<Integer>>();
if (nums.length ==1){
ArrayList<Integer> subset1 = new ArrayList<Integer>();
ArrayList<Integer> subset2 = new ArrayList<Integer>();
subset2.add(nums[0]);
subsets.add(subset1);
subsets.add(subset2);
return subsets;
}
int[] nums_1 = new int[nums.length-1];
for(int i = 0; i< nums.length-1; i++) {
nums_1[i]=nums[i];
}
List<ArrayList<Integer>> subsets2= subsets(nums_1);
ArrayList<ArrayList<Integer>> …Run Code Online (Sandbox Code Playgroud) 我有需要的方法Collection<Object>,其中Object可以是一个String或CustomClass.然后它接受集合的每个元素并将其传递给具有如下参数的方法Object:
public void foo(Collection<Object> c) {
for(Object o : c)
bar(o);
}
public void bar(Object o) {
if(o instanceof String || o instanceof CustomClass) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
bar当我通过它正常工作String或CustomClass,但是当我试图通过一个NavigableSet<String>给foo我弄cannot find symbol; symbol : method foo(java.util.NavigableSet<java.lang.String>).
但是,如果我更改参数类型foo以Collection<String>它工作正常,但是这意味着我需要一个新的foo(Collection<CustomClass>),这将涉及到重复代码的方法.有没有解决的办法?
我有两个类:超类Cluster和子类XCluster.XCluster扩展了Cluster.
我有这个方法签名:
public Map<Integer, XCluster> getClusters() {
...
}
Run Code Online (Sandbox Code Playgroud)
我有这个变量:
Map<Integer, Cluster> clusters = getClusters();
Run Code Online (Sandbox Code Playgroud)
我无法编译这个.Eclipse说方法getCluster()不返回这种类型.我需要将类型从XCluster更改为Cluster.
怎么了?
1. List<Car> carList = new ArrayList<Sedan>();
2. List<Car> carList = new ArrayList<Car>();
carList.add(new Sedan());
Run Code Online (Sandbox Code Playgroud)
1有编译错误,2是合法的.
为什么变量声明的类型必须与我们传递给对象类型的类型匹配(不允许派生类型)?我使用的数据如下,绝对正确:
int SIZE = 10;
Car[] carArray = new Sedan[SIZE];
Run Code Online (Sandbox Code Playgroud)
谁能告诉我为什么收藏品必须声明为条件2?谢谢
我有三行代码:
1) List<String> list = new ArrayList<String>();
Run Code Online (Sandbox Code Playgroud)
这不会产生任何错误,
但是当我编写以下代码行时
2)Map<String, List<String>> map = new HashMap<String, ArrayList<String>>();
Run Code Online (Sandbox Code Playgroud)
我得到以下错误
类型不匹配:无法转换HashMap<String,ArrayList<String>> to Map<String,List<String>>
3)Map<String,String> d= new HashMap<String,String>();
Run Code Online (Sandbox Code Playgroud)
此行不会产生任何错误
我想知道为什么
(2)行显示我错误.提前致谢.:)
我有一个这样的课:
public class GenericClass<T> {
public void wrap(T item) {...}
}
public abstract class AbstractClass<T, G extends GenericClass<T>> {
protected G wrapper;
public AbstractClass(Class<G> generic, T something) {
wrapper = generic.newInstance();
wrapper.wrap(something);
}
public G wrapAndGet(T item) throws Exception {
wrapper.wrap(item);
return wrapper;
}
}
// 90% of the time people only need this:
public class GeneralClass<T> extends AbstractClass<T, GenericClass<T>> {
public GeneralClass(T something) {
super(GenericClass.class, something); // !error, asking for Class<GenericClass<T>>
}
}
// and use it like this: …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
如果我正在做 …