java方法能不能继承方法_关于java:方法链接+继承不能很好地一起玩吗?
這個問題是在C++環境中提出的,但我對Java很好奇。對虛擬方法的關注并不適用(我認為),但是如果您遇到這種情況:
abstract class Pet
{
private String name;
public Pet setName(String name) { this.name = name; return this; }
}
class Cat extends Pet
{
public Cat catchMice() {
System.out.println("I caught a mouse!");
return this;
}
}
class Dog extends Pet
{
public Dog catchFrisbee() {
System.out.println("I caught a frisbee!");
return this;
}
}
class Bird extends Pet
{
public Bird layEgg() {
...
return this;
}
}
{
Cat c = new Cat();
c.setName("Morris").catchMice(); // error! setName returns Pet, not Cat
Dog d = new Dog();
d.setName("Snoopy").catchFrisbee(); // error! setName returns Pet, not Dog
Bird b = new Bird();
b.setName("Tweety").layEgg(); // error! setName returns Pet, not Bird
}
在這種類層次結構中,是否有任何方法可以返回this,而不(有效地)向上轉換對象類型?
現在我明白了為什么這么多人討厭Java。
如果希望避免編譯器發出未選中的強制轉換警告(并且不希望@suppresswarnings("unchecked"),則需要執行以下操作:
首先,您對寵物的定義必須是自引用的,因為寵物總是一個通用類型:
abstract class Pet >
其次,setname中的(T) this強制轉換也未選中。要避免這種情況,請使用安吉麗卡·蘭格的《優秀仿制藥常見問題解答》中的"getthis"技術:
The"getThis" trick provides a way to
recover the exact type of the this
reference.
這將導致下面的代碼編譯并運行,而不發出警告。如果您想擴展子類,那么該技術仍然有效(盡管您可能需要將中間類泛型化)。
產生的代碼是:
public class TestClass {
static abstract class Pet > {
private String name;
protected abstract T getThis();
public T setName(String name) {
this.name = name;
return getThis(); }
}
static class Cat extends Pet {
@Override protected Cat getThis() { return this; }
public Cat catchMice() {
System.out.println("I caught a mouse!");
return getThis();
}
}
static class Dog extends Pet {
@Override protected Dog getThis() { return this; }
public Dog catchFrisbee() {
System.out.println("I caught a frisbee!");
return getThis();
}
}
public static void main(String[] args) {
Cat c = new Cat();
c.setName("Morris").catchMice();
Dog d = new Dog();
d.setName("Snoopy").catchFrisbee();
}
}
代碼通過這種方式變得更干凈,我將花一些時間閱讀安吉麗卡的完整文章,THXVM!
class Snake extends Pet{@Override protected Cat getThis() {return new Cat();}}
不過,當您有中間的非抽象、非最終類并且需要創建實例時,這會變得有點棘手。例如,假設你有一個static class Poodle extends Dog,把Dog改為static class Dog> extends Pet。現在創建一個原始的Dog實例是很困難的。
有沒有什么方法可以和annonymous類一起使用?我找不到一種方法讓它自己引用泛型t:。/
我創造了一個有用的東西:class PetAnnon extends Pet{},在每一個Annonymous類上,我都像new Pet{...一樣使用它,現在像T get(Classcl){return (T)this.val;}這樣的方法將再次有效。
這個老把戲怎么樣:
abstract class Pet
{
private String name;
public T setName(String name) { this.name = name; return (T) this; }
}
class Cat extends Pet
{
/* ... */
}
class Dog extends Pet
{
/* ... */
}
+1.表達得比我簡潔。但是考慮到Java泛型已經存在了多久,它會有多大的技巧呢?
啊哈,我想會有一些仿制藥,只是不知道是什么。謝謝!
Steve B:在Java中它不是舊的(實際上,我不認為它已經在Java中使用過),但是它已經在C++中使用了很長時間。
嗯,你能再加一個上拋和下拋的例子嗎?例如PET?>pet=c;((貓)pet).catchmices();(我有這個權利嗎?)
stackoverflow.com/questions/149336/…stackoverflow.com/questions/9138027/…
如果你有一個迭代器,那么這樣做:public Iteratoriterator() {,這樣你就不必為貓和狗實現一個迭代器,但是你仍然可以循環貓和狗,實際上得到一個貓或狗而不是寵物!
不,不是真的。您可以通過使用協變返回類型來解決這個問題(感謝McDowell提供正確的名稱):
@Override
public Cat setName(String name) {
super.setName(name);
return this;
}
(協變返回類型僅在Java 5和以上,如果這是您的關注點)。
這有點復雜,但是你可以用泛型來實現:
abstract class Pet< T extends Pet > {
private String name;
public T setName( String name ) {
this.name = name;
return (T)this;
}
public static class Cat extends Pet< Cat > {
public Cat catchMice() {
System.out.println("I caught a mouse!" );
return this;
}
}
public static class Dog extends Pet< Dog > {
public Dog catchFrisbee() {
System.out.println("I caught a frisbee!" );
return this;
}
}
public static void main (String[] args){
Cat c = new Cat();
c.setName("Morris" ).catchMice(); // error! setName returns Pet, not Cat
Dog d = new Dog();
d.setName("Snoopy" ).catchFrisbee(); // error! setName returns Pet, not Dog
}
}
public class Pet {
private String name;
public AnimalType setName(String name) {
this.name = name; return (AnimalType)this;
}
}
和
public class Cat extends Pet {
public Cat catchMice() {return this;}
public static void main(String[] args) {
Cat c = new Cat().setName("bob").catchMice();
}
}
@史蒂夫B.-+1,跟我打賭!
編輯:復制/粘貼代碼就成功了。我意識到我的基礎班是X extends Y,而不是X extends Y。解決了!
總結
以上是生活随笔為你收集整理的java方法能不能继承方法_关于java:方法链接+继承不能很好地一起玩吗?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 贾平凹怎么读 姓氏读音及其代表作简介?
- 下一篇: 网名安奈怎么起情侣名?