日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java方法能不能继承方法_关于java:方法链接+继承不能很好地一起玩吗?

發布時間:2024/9/27 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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:方法链接+继承不能很好地一起玩吗?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。