这是Java泛型的非常简单的示例。 我的问题是,当类期望将我的AirUnit列表添加到arraylist中时,该类期望的是实现了Vehicle的类型而不是实现了AirUnit的类型时,为什么编译器在不运行Java的情况下在intellij 13中不显示编译错误?期望拥有高等级车。

车辆:

public interface Vehicle {
     void goForward();
}

AirUnit:

public interface AirUnit {
 void fly();
}

Highway类,它接收一系列车辆并运行它们并打印其toString()。

import java.util.ArrayList;

public class HighWay<T extends Vehicle> {

    private ArrayList<T> vehicles;

    public HighWay(ArrayList<T> vehiclesOnTheRoad){
        this.vehicles = vehiclesOnTheRoad;
    }


    public void moveTheVehicles(){
        for(T vehicle: vehicles){
            System.out.println(vehicle);
        }
    }
}

客户端

import java.util.ArrayList;

            public class Client {

                public static void  main(String[] args) {
                    Vehicle car = new Car();
                    Vehicle bike = new Bike();
                    AirUnit plane = new Plane();

                    ArrayList<Vehicle> vehicles = new ArrayList();
                    ArrayList<AirUnit> airUnites = new ArrayList();
                    airUnites.add(plane);

                    vehicles.add(car);
                    vehicles.add(bike);


                    // should show compile error because HighWay is expecting something
                    // that implements Vehicle but it is now showing any errors
                    // until I run the app and it breaks in the loop.
                    HighWay<Vehicle> highWay = new HighWay(airUnites);
                    highWay.moveTheVehicles();
                }
            }

===============>>#1 票数:1

问题在于,编译器在声明要实例化的HighWay类型时会测试该类型。 如果您告诉它您使用的是哪种类型,那么它将抱怨,例如

HighWay<Car> highWay = new HighWay<> (airUnites);

会导致错误,因为airUnites不是汽车列表,或者

HighWay<Plane> highWay = new HighWay<> (airUnites);

也会失败,因为“平面”不扩展“载具”,因此不匹配您指定的约束。 但是由于您未指定要创建的高速公路的类型,因此它会关闭常规类型检查。 因此,它应该发出警告,告诉您应该指定类型,尽管您可能已禁用警告(请在IDE中检查编译器设置,以查看是否为这种情况-我不确定如何这样做是因为我不使用IntelliJ)。

===============>>#2 票数:0

这是因为您没有在声明highWay时声明要使用的泛型类型:

HighWay highWay = new HighWay(airUnites);

这将创建一个非泛型类型,其中所有Object都使用Object ,而您必须正确使用它。 最好想到这样说:

HighWay<Object> highWay = new HighWay<>(airUnites);

  ask by SamTheGoodOne translate from so

未解决问题?本站智能推荐:

5回复

Java泛型编译错误

出现编译器错误: 我了解我无法将impl转换回其API接口(因为API不仅仅是-一个API)。 但是我对于为什么会出现编译器错误感到困惑! Java是否应该尊重SedimentaryMineral是IMineral并允许这样做?!? 除了说明为什么会出现此编译器错误的原因外,
2回复

java泛型编译错误

我有以下通用类: 这就是我简单使用它的方式: Eclipse编译未显示任何错误,但是-使用ant进行构建会产生以下错误: 谢谢!
2回复

java泛型通配符编译错误(泛型的泛型)

您好,我对这种和平的代码有一个编译问题。 如何执行安全添加到数据变量?
1回复

java泛型编译错误,堆栈上的泛型类

我不确定为什么这在Java中不起作用: 问题线: 找不到符号:方法T() required:array或java.lang.Iterable,found:R 需要java.lang.Integer发现:java.lang.String原因:实际参数java.l
4回复

Java泛型编译错误“不兼容的类型”(在gradle中,但不在IDE中)

在以下情况下,我在理解Java泛型的行为时遇到问题。 有一些参数化接口IFace<T> ,并且在某个类上的方法返回了扩展该接口的类, <C extends IFace<?>> Class<C> getClazz() java编译错误由grad
1回复

在Java中实现简单的泛型函数时发生编译错误?

这是我的代码: 在一行: if(max<t)生成错误:没有为参数T定义运算符< 在我搜索谷歌之后,似乎我应该做出类似的事情,这对于一个简单的任务来说太复杂了。因为我只想实现简单的findmax(原始数组)。 有什么建议可以使该编译错误消失,或者如何轻松实现此简单的
3回复

泛型编译错误

有以下课程: 然后有 现在还有这个包装器: 为了完成图片,还有方法 现在,当编写以下代码时 我收到以下编译错误: MyType类型的方法validate(LivingBeingWrappe <LivingBeing> livingBe
4回复

编译错误与泛型

test1和test2之间的区别在哪里? 为什么test1中的编译错误?
2回复

泛型编译错误

使用ormlite在Android项目中出现错误,我在此代码上得到编译错误: 但是当我尝试使用Eclipse构建项目时效果很好 该错误看起来类似于此SO问题 。 我不知道是Idea还是javac的bug。 我的配置:IntelliJ IDEA 11.0.2 Build#
4回复

Java泛型编译错误-不了解该错误

我知道很多人都在问这样的问题,但是我真的没有这个问题。 (如果您需要更多代码,请告知) IAnswerStorage是一个空接口 这些是我需要解释的3个泛型类。 在QuestionManager ,问题必须是问题( IQuestions )[指定存储空间] 我现在尝试