考虑这个例子(典型的OOP书籍):
我有一个Animal
班级,每个人都Animal
可以有很多朋友.
和子类一样Dog
,Duck
,Mouse
等它添加特定的行为一样bark()
,quack()
等等.
这是Animal
班级:
public class Animal {
private Map<String,Animal> friends = new HashMap<>();
public void addFriend(String name, Animal animal){
friends.put(name,animal);
}
public Animal callFriend(String name){
return friends.get(name);
}
}
Run Code Online (Sandbox Code Playgroud)
这里有一些代码片段有很多类型转换:
Mouse jerry = new Mouse();
jerry.addFriend("spike", new Dog());
jerry.addFriend("quacker", new Duck());
((Dog) jerry.callFriend("spike")).bark();
((Duck) jerry.callFriend("quacker")).quack();
Run Code Online (Sandbox Code Playgroud)
有什么办法可以使用泛型来返回类型来摆脱类型转换,这样我就可以说了
jerry.callFriend("spike").bark();
jerry.callFriend("quacker").quack();
Run Code Online (Sandbox Code Playgroud)
这里有一些返回类型的初始代码作为一个从未使用过的参数传递给方法.
public<T extends Animal> T callFriend(String name, T unusedTypeObj){
return (T)friends.get(name);
}
Run Code Online (Sandbox Code Playgroud)
有没有办法在运行时找出返回类型而不使用额外的参数instanceof
?或者至少通过传递类型的类而不是虚拟实例. …
可以在Java中覆盖私有方法吗?如果不是,那么以下代码如何工作?
class Base{
private void func(){
System.out.println("In Base Class func method !!");
};
}
class Derived extends Base{
public void func(){ // Is this a Method Overriding..????
System.out.println("In Derived Class func method");
}
}
class InheritDemo{
public static void main(String [] args){
Derived d = new Derived();
d.func();
}
}
Run Code Online (Sandbox Code Playgroud) 我读过一本书,它说我可以覆盖一个方法,如果它有相同的签名.根据书中方法的签名是Method_Name + Parameters传递.
根据本书,我可以覆盖具有不同返回类型的方法.实际上是否可以在Java中覆盖具有不同返回类型的方法?因为我在网上做了一些搜索,我发现有人说要覆盖一个方法,返回类型也应该是相同的.
根据书中它还说当我们尝试使用相同的方法名称和参数但不同的返回类型重载方法时,java将抛出编译错误,因为签名仅表示方法名称和参数.如果这是真的,我们应该能够覆盖具有不同返回类型的方法.
请帮我理解这个.提前致谢.
我有一个接口A和B.A有一个叫做foo的(抽象)方法.B延伸A.
即使使用@Override,也可以在接口B中覆盖foo,但是在任何情况下都有意义吗?没有什么可以覆盖,因为这两种方法都必须是抽象的,没有正文.所以我猜没有合理的情况,对吧?
那么为什么可以在界面中覆盖呢?
当我使用类型参数创建一个类时:
public abstract class AbstractBox<T> {
abstract T getContent();
}
Run Code Online (Sandbox Code Playgroud)
那么我仍然可以创建一个没有类型参数的子类:
class SomeBox extends AbstractBox { // DISALLOW THIS
@Override
Something getContent() {
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
我可以以某种方式强制子类提供类型参数(即使它只是Object
)?例如,我想禁止上述内容但允许:
class SomeBox extends AbstractBox<Something> { // ALLOW THIS
@Override
Something getContent() {
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:这不是重复的可以覆盖的方法在返回类型上有所不同?.该问题询问重写方法是否可以返回type参数的子类型.
我的问题是,我是否可以强制执行带有类型参数的抽象的任何子类必须提供类型参数.
我是IOS的新手,任何人都可以告诉IOS中方法重载和覆盖之间有什么区别.我已经完成了这个但是它是java,我想知道IOS一样(目标c或swift,如果可能的话)一些代码)
我试图覆盖返回类型为子类中的列表的方法,如下例所示,由于泛型问题,我无法在子类中执行此操作.我无法改变我的超类代码,所以我如何解决这个问题?任何人都可以指导我...非常感谢提前.
无法更新的超级课程:
public class Animal {
private String legs;
}
public class TestSuper {
public List<Animal> addAnimals() {
return animals;
}
}
Run Code Online (Sandbox Code Playgroud)
子类:
public class Dog extends Animal {
private String sound;
}
public class TestSub extends TestSuper {
public List<Dog> addAnimals() { --> I need to override this method but want return type as List of dogs
return null;
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个ShoppingCart
使用ItemOrder
对象的类.
public class ShoppingCart extends ArrayList<ItemOrder> {
Run Code Online (Sandbox Code Playgroud)
我有一个方法,检查一个对象是否已经存在于数组列表中,如果是这样,用新对象替换索引,如果没有添加新对象.
public boolean add(ItemOrder order){
if (super.indexOf(order) != -1){ //ITEM ALREADY IN LIST, REPLACE
super.remove(super.indexOf(order));
super.set(super.indexOf(order), order);
}
else //ITEM NOT IN LIST, ADD
super.add(order);
return true; //TO SATISFY RETURN TYPE
}
Run Code Online (Sandbox Code Playgroud)
当我编写方法时,我没有返回类型.我收到一个错误,建议我将返回类型设置为void,所以我这样做了.然后我得到另一个错误,返回类型必须是布尔值.我唯一的问题是方法本身并不是(至少对我来说)一个真/假的回报.我需要做的就是添加/替换ArrayList中的对象,而不是返回任何内容.
为什么这个方法需要一个布尔返回类型,并且我在最后简单地投入是安全return true;
的,还是我真的应该使用它?
我必须实现具有签名的接口方法:
public int runMethod(final int key, Reference <String> result);
Run Code Online (Sandbox Code Playgroud)
我必须result
在方法返回之前更新参数的值。例如,如果的值result
是ABC
在调用方法时,则我需要将其修改为DEF
并返回调用方。有人可以建议我如何实现它吗?
这样做时,我收到此错误:
The return type is incompatible with MouseAdapter.mouseClicked(MouseEvent)
Run Code Online (Sandbox Code Playgroud)
类:
public class MyMouseAdapter extends MouseAdapter
{
public MyMouseAdapter()
{
// TODO Auto-generated constructor stub
}
@Override
public String mouseClicked(MouseEvent e)
{
// TODO Auto-generated method stub
}
}
Run Code Online (Sandbox Code Playgroud)
哪里错了?原来的方法是public void mouseClicked(MouseEvent e)
PLEASE NOTE - I am asking WHY? It would be very useful if you could give an example where changing the return type actually breaks the code
why can't I change the return type of an overridden method (other than covariant return types).
class Parent{
public void sayhello(){ ... };
}
class Child extends Parent{
public String sayhello() { . . .}
}
Run Code Online (Sandbox Code Playgroud)
Now if I run the following code:
class test{
public static void main(String[] args){
Parent p = …
Run Code Online (Sandbox Code Playgroud) 请帮助我找到以下两个问题的答案,均在java面试中问到:
在这种情况下,将使用new关键字在JVM堆栈中分配内存(堆中没有任何内容)。
在这种情况下,方法重载将基于返回类型,方法名称和参数相同(我回答说在Java中是不可能的)
根据我的知识和从Google的发现,两者都无法完成,我的答案是:
New将始终在堆中分配内存,并且可以通过堆栈中的引用进行引用
重载取决于编译时间,如果不遵循以下情况,它将给编译器错误
但是他没有被说服。
java ×12
overriding ×4
generics ×3
overloading ×2
boolean ×1
covariance ×1
extends ×1
inheritance ×1
interface ×1
ios ×1
jvm ×1
objective-c ×1
oop ×1
polymorphism ×1
reference ×1
return ×1
return-value ×1
swift ×1
swing ×1